Question

J'ai un modèle appelé Contact qui a l'invité has_one comme tel.

class Contact < ActiveRecord::Base
  has_one :guest, :class_name => "Contact", :foreign_key => "guest"
end

Dans ma vue Création, j'utilise la méthode d'assistance à la sélection pour répertorier tous les contacts pouvant être choisis en tant qu'invités, de la sorte ...

<% form_for(@contact) do |f| %>
  <%= f.error_messages %>
    ...
    <p>
        <%= f.label :guest %><br />
        <% @guests = Contact.find(:all, :order => "lastname").map { |u| [u.lastname + ', ' + u.firstname, u.id] } %>
        <%= f.select :guest, @guests, {:include_blank => true} %>
    </p>
    ...
<% end %>

Chaque fois que ce formulaire est envoyé, un message d'erreur s'affiche pour indiquer qu'il attendait un contact mais qu'il recevait une chaîne.

Où et comment convertir la chaîne soumise par le formulaire en contact avant de sauvegarder le contact actuel dans la base de données?

Était-ce utile?

La solution

Lorsque vous créez une association dans Rails, telle que has_one, certaines méthodes sont générées dynamiquement pour votre objet pour une affectation aisée.

À l'heure actuelle, la méthode que vous utilisez est

@contact.guest = @guest

Et votre objet contact s'attend à recevoir un autre objet ActiveRecord auquel il pourrait s'associer. Ce que vous essayez de faire, c’est gentil "faux". cette méthode dans votre formulaire qui enveloppe un objet de modèle. (Les informations provenant des paramètres sont importées sous forme de chaîne, raison pour laquelle vous obtenez cette erreur.)

Il y a plusieurs façons de mettre en œuvre ceci. La première avec utilise des attributs de modèle imbriqués. . . formulaires complexes vous permettant d’envelopper une association d’enfants dans le formulaire_pour que vous utilisez (à l’aide de l’assistant de formulaire fields_for ). Il faudrait beaucoup de temps pour expliquer cela et heureusement, il existe des ressources gratuites incroyables sur des formulaires complexes:

Railscasts Complex Forms 1ère partie

Railscasts Complex Forms, partie 2

Railscasts Complex Forms, partie 3

De même, si vous utilisez Rails 2.3, recherchez des informations sur le paramètre " includes_nested_attributes_for ". . . . Il y a un manque flagrant de tutoriels à l'heure actuelle, mais j'imagine qu'avec la version 2.3, beaucoup de choses vont arriver. Ce petit assistant pratique supprimera environ la moitié du code que Ryan utilise dans ses projections d’écran pour faire en sorte que les formulaires acceptent un modèle subordonné.

Enfin, il existe une solution de contournement. Si votre relation est simple, si les invités que vous souhaitez associer sont déjà dans la base de données et que vous n'avez pas besoin d'en créer de nouveaux à partir du formulaire que vous utilisez, vous pouvez utiliser quelque chose comme un attribut virtuel. Dans votre formulaire, modifiez simplement votre f.select: guest en quelque chose comme f.select: guest_select et implémentez une méthode dans votre modèle:

def guest_select=(incoming_id_from_form)
  contact = Contact.find(incoming_id_from_form)
  self.guest = contact
end

Qui assignera le modèle ActiveRecord sans avoir à implémenter un formulaire complexe pour le faire à votre place!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top