2013-05-22 2 views
3

Я пишу форму для регистрации пользователями своих продуктов. У меня уже есть class User has_many :products и class Product belongs_to :user; attr_accessible :serial_number. Поэтому идея состоит в том, что пользователь вводит серийный номер в форме, и я вызываю @user.products << Product.find_by_serial_number params[:serial_number] или somesuch.Rails form_for и text_field без атрибута модели

казалось разумным, чтобы добавить это как действие регистра в UsersController:

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

И я следующее 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 %> 

Это бросает ошибку:

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

Итак ... a) Как остановить эту ошибку? б) Умм ... что произойдет после нажатия кнопки отправки? Я предполагаю, что это назовет действие update (которое также используется формой редактирования) ... Должен ли я сделать это толще, чтобы иметь дело с обеими возможностями? Или сделать новое действие? (Если это так, как мне перенаправить форму, чтобы указать на это?) C) Обработка ошибок (помещая недопустимый серийный номер) лучше всего обрабатывать в контроллере, а не в модели, верно?

Спасибо.

ответ

2

Ошибка броска указывает на то, что нет никакого способа serial_number для User модели ... которая есть нет. Метод фактически прикреплен к модели Product, но форма в register.html.erb предназначена для User. Вы можете решить эту проблему, используя вложенную форму.

Во-первых, убедитесь, что User может принимать вложенные атрибуты для Product:

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

Затем сделать вашу форму в вложенном виде:

# 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

Вы можете использовать хелпер формы только для атрибутов модели. В этом случае вам нужно будет использовать полный метод.

= label_tag :serial_number, 'Serial number' 
= text_field_tag :serial_number 
Смежные вопросы