rails提交复选框的其他参数以创建操作

时间:2014-11-06 22:44:55

标签: ruby ruby-on-rails-3 forms model rails-activerecord

我创建了一个新的rails项目并生成了一些脚手架。

对于这个问题,我将讨论两个模型/实体/类:

Model_A
Model_B

我正在谈论rails项目的全新设置,并在使用scaffold时自动生成代码。

Model_AModel_B之间的关系为:Model_AModel_B个,Model_B属于Model_A

我想在new.html.erb的{​​{1}}中修改新表单。在浏览器中调用Model_A时,它会向我显示表单。我更新了表单,因此它显示了我之前创建的每个/Model_As对象的列表。每一行都包含Model_B,这是我的问题:

当我致电check_box时,我想创建一个/Model_As的新对象。 Model_A有很多Model_A所以检查一些列出的Model_B对象会很好,当我按下提交时,将创建Model_B对象并引用已检查的{{1}对象。听起来不是那么棘手,但我无法解决它。

如何修改Model_A控制器?我必须添加路线吗?我的表单代码看起来如何?

我知道Model_B Model_A,但没有运气。

以太我确实得到了必要的form_helper(检查对象的id数组)但是没有创建check_box_tag对象。或者对象正在创建,但不提交ID。

我认为对于经验丰富的ruby / rails开发人员来说这不是问题。我是这个人的新手。

谢谢!

1 个答案:

答案 0 :(得分:0)

您必须主要在两个文件中进行更改。

  1. controllers/model_as_controller.rb - new操作

    def new
      @model_a = Model_A.new
      @model_bs = Model_B.all
    end
    
  2. views/model_as/new.html.erb - 以新的@model_a

    的形式
    <%= form_for ... %>
      ...
    
      <%= hidden_field_tag :model_bs %>
      <% @model_bs.each do |model_b| %>
        <%= check_box_tag "model_bs[]", model_b.id %>
        <%= label_tag("model_b_#{model_b.id}", model_b.name) %>
      <% end %>
    
      ...
    <% end %>
    
  3. controllers/model_as_controller.rb - create行动。 在提交new.html.erb上的表单后,应用程序将路由到此创建操作。 已检查的model_bs列表将作为由逗号分隔的Model_B对象的ID字符串。 格式为 - &#34; 1,4,7&#34;。所以你编写以下代码将它们提取到一个id数组

    def create
      model_bs = Model_B.find(params[:model_bs])
    
      ... # the code to create the @model_a object and save it
      ...
    
      @model_a.model_bs << model_bs # This will set the model_a id in all the model_b objects
      @model_a.save!
    
      ... #code to redirect on success or render 'new' on failure
    end
    
  4. 确保Model_bs表格中有一个字段model_a_id,并在适当的模型中写入has_many :model_bsbelongs_to :model_a行。