【问题标题】:Rails form_for and text_field without model attributeRails form_for 和 text_field 没有模型属性
【发布时间】:2013-05-22 22:43:08
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby forms


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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 %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        • 2018-09-23
        • 1970-01-01
        相关资源
        最近更新 更多