如何在不存在冲突的form_for的情况下从不同的控制器呈现_form文件?

时间:2015-06-10 21:07:57

标签: ruby-on-rails ruby ruby-on-rails-4

假设我有2个型号,Box.rb和Toy.rb. Rails为我提供了独立创建新玩具和盒子的页面和方法。但是,我想确保/提供在第一次创建盒子时创建盒子的第一个玩具的能力

与DRY一致,我想简单地将<%= render "Toy/form" %>放在为_form.html.erb生成的Box文件中。

问题在于,玩具的_form文件包含form_for方法,原因很明显。对于我想要做的事情来说这是一个问题,因为我最终会将1个表格嵌套在另一个表格中,而我真正想要的是在保持DRY的同时获取玩具字段......?

1 个答案:

答案 0 :(得分:1)

您应该使用accepts_nested_attributes_forfields_for。假设您的关联是这样的

#box.rb
Class Box < ActiveRecord::Base
  has_many :toys
  accepts_nested_attributes_for :toys
end

#toy.rb
Class Toy < ActiveRecord::Base
  belongs_to :box
end


#box_controller.rb

def new
 @box = Box.new
 @toy = @box.toys.build
end

def create
  @box = Box.new(box_params)
  if @box.save
    -----
  else
    -----
  end
end

private

def box_params
  params.require(:box).permit(:box_attribute_1,:box_attribute_2,:more_box_attributes, toys_attributes: [:toy_attribute_1,:more_toy_attributes])
end

box/form中,您可以这样做

  <%= form_for(@box) do |f| %>
    <div class="field">
        <%= f.label :box_attribute_1 %><br />
        <%= f.text_field :box_attribute_1 %>
    </div>
    <div class="field">
        <%= f.label :box_attribute_2 %><br />
        <%= f.text_field :box_attribute_2 %>
    </div>
    <div class="field">
        <%= f.label :box_attribute_3 %><br />
        <%= f.text_field :box_attribute_3 %>
    </div>

    <%= f.fields_for @toy do |builder| %>
        <%= render 'toys/form', :f => builder %>
    <% end %>
  <% end %>