没有model属性的Rails form_for和text_field

时间:2013-05-22 22:43:08

标签: ruby-on-rails ruby forms

我正在为用户编写表单以注册他们的产品。我已经有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)错误处理(输入无效的序列号)最好在控制器中处理,而不是模型,对吗?

感谢。

2 个答案:

答案 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 %>