我正在为用户编写表单以注册他们的产品。我已经有class User has_many :products
和class Product belongs_to :user; attr_accessible :serial_number
了。所以我的想法是用户在表单中输入序列号,我打电话给@user.products << Product.find_by_serial_number params[:serial_number]
或者其他人。
将此作为注册操作添加到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)如何阻止此错误? b)嗯......按下提交按钮后会发生什么?我假设它会调用update
动作(编辑表单也使用它)...我应该更加努力地处理两种可能性吗?或者采取新行动? (如果是这样,我如何重新路由表单以指向它?)c)错误处理(输入无效的序列号)最好在控制器中处理,而不是模型,对吗?
感谢。
答案 0 :(得分:3)
您只能将表单助手用于模型的属性。在这种情况下,您将需要使用完整的方法。
= label_tag :serial_number, 'Serial number'
= text_field_tag :serial_number
答案 1 :(得分:2)
抛出的错误表明serial_number
模型没有方法User
......没有。{1}}模型。该方法实际上已附加到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 %>