2013-05-22 8 views
3

J'écris un formulaire pour les utilisateurs d'enregistrer leurs produits. J'ai déjà class User has_many :products et class Product belongs_to :user; attr_accessible :serial_number. Donc, l'idée est que l'utilisateur entre le numéro de série dans le formulaire et j'appelle @user.products << Product.find_by_serial_number params[:serial_number] ou somesuch.Rails form_for et text_field sans modèle attribut

Il semblait judicieux d'ajouter cela comme une action de registre à l'UsersController:

resources :users do 
    member do 
    get 'register' 
    end 
end 

et moi avons les éléments suivants dans register.html.erb:

5: <%= render 'shared/error_messages' %> 
6: 
7: <%= f.label :serial_number, "Serial number" %> 
8: <%= f.text_field :serial_number %> 
9: 
10: <%= f.submit "Register product" %> 
11: <% end %> 

Cela jette l'erreur:

undefined method `serial_number' for #<User:0x000000060b1d40> 
extracted source (around line #8): 
... 

Alors ... a) Comment arrêter cette erreur? b) Euh ... que va-t-il se passer après avoir appuyé sur le bouton Soumettre? Je suppose que ça va appeler l'action update (qui est également utilisé par le formulaire de modification) ... dois-je faire que plus gras à traiter avec les deux possiblités? Ou faire une nouvelle action? (Si oui, comment puis-je réacheminer le formulaire pour indiquer que?) C) de gestion des erreurs (mettre dans un numéro de série valide) est mieux gérée dans le contrôleur, pas le modèle, non?

Merci.

Répondre

2

L'erreur étant jetée indique qu'il n'y a pas de méthode serial_number pour le modèle User ... qui il n'y a pas. La méthode est réellement attaché au modèle Product, mais la forme est register.html.erb pour User. Vous pouvez résoudre cela en utilisant un formulaire imbriqué.

Tout d'abord, assurez-vous que User peut accepter des attributs imbriqués pour Product:

# app/models/user.rb 
has_many :products 
accepts_nested_attributes_for :products 

Ensuite, faites votre forme en une forme imbriquée:

# app/views/users/register.html.erb 
<%= form_for(@user) do |f| %> 

    <%= f.fields_for :products do |e| %> 
    <%= e.label :serial_number, "Serial number" %> 
    <%= e.text_field :serial_number %> 
    <% end %> 

    <%= f.submit "Register product" %> 

<% end %> 
2

Vous ne pouvez utiliser l'assistant de formulaire pour les attributs du modèle. Dans ce cas, vous devrez utiliser la méthode complète.

= label_tag :serial_number, 'Serial number' 
= text_field_tag :serial_number