4

我正在写一个表格供用户注册他们的产品。我已经有了class User has_many :productsclass 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)错误处理(输入无效的序列号)最好在控制器中处理,而不是在模型中处理,对吗?

谢谢。

4

2 回答 2

4

您只能将表单助手用于模型的属性。在这种情况下,您将需要使用完整方法。

 = label_tag :serial_number, 'Serial number'
 = text_field_tag :serial_number
于 2013-05-22T22:54:43.647 回答
2

抛出的错误表明模型没有方法serial_number......User没有。该方法实际上是附加到Product模型中的,但是中的形式register.html.erb是 for 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 %>
于 2013-05-22T22:56:04.647 回答