在同一视图中创建has_many belongs_to association child和parents模型

时间:2016-01-20 23:30:21

标签: ruby-on-rails has-many belongs-to

所以我有两个模特:

#app/models/diy.rb
class Diy < Activerecord::Base
   #schema id | summary | created_at | updated_at 
   has_many :steps
end

#app/models/step.rb
class Step < ActiveRecord::Base
   # schema id | step_content | photo | created_at | updated_at
   belongs_to :diy
end

有没有办法在同一个视图中创建一个diy数据库行并与它关联步骤数据库行?

最近我得到的是:

 <%= form_for(@diy) do |f| %>
   <%= f.label :summary  %><br>
   <%= f.text_field :summary %><br>
   <%= f.label :steps  %><br>
   <%= f.text_field :steps %><br>
   <%= f.submit %>
 <% end %>

但是使用此代码我没有访问步骤表中的任何列。

如果它有助于解决问题,使用此代码我会得到&#34;步骤&#34;文本字段已填充&#34; Step :: ActiveRecord_Associations_CollectionProxy:0x9613ce0&#34;。

2 个答案:

答案 0 :(得分:3)

class Diy < ActiveRecord::Base
  has_many :steps
  accepts_nested_attributes_for :steps
end

class Step < ActiveRecord::Base
  belongs_to :diy
end

accepts_nested_attributes_for让Diy获取步骤的属性:

Diy.create( steps_attributes: [{ step_content: 'Stir it.' }] )

要创建表单输入,请使用fields_for

<%= form_for(@diy) do |f| %>
   <%= f.label :summary  %><br>
   <%= f.text_field :summary %><br>
   <%- # wrapping it in a fieldset element is optional -%>
   <fieldset>
     <legend>Steps</legend>
     <% f.fields_for(:steps) do |step_fields| %>
        <%= step_fields.label :step_content  %><br>
        <%= step_fields.text_field :step_content %><br>
     <% end %>
   </fieldset>
   <%= f.submit %>
 <% end %>

它通过@diy.steps迭代它并为每个创建<textarea name="diy[steps_attributes][][step_content]">step_fields是一个表单构建器,其范围限定为特定的嵌套记录。

请注意,如果新记录中的@diy.steps为零,则表示没有表单输入。要解决这个问题,你需要为记录播种:

class DiysController

  # ...
  def new
    @diy = Diy.new
    @diy.steps.new # creates a new step that the user can fill in.
  end

  def edit
    @diy = Diy.find(params[:id])
    @diy.steps.new # creates a new step that the user can fill in.
  end
end

为了避免获得大量垃圾步骤,您可以使用reject_if选项:

class Diy < ActiveRecord::Base
  has_many :steps
  accepts_nested_attributes_for :steps, reject_if: :all_blank
end

要将控制器中的嵌套属性列入白名单,请使用包含允许属性的数组:

def diy_params
  params.require(:diy).permit(:summary, steps_attributes: [:step_content])
end

请阅读:

答案 1 :(得分:1)

要添加到i的答案,您需要使用以下内容:

j

-

如果您只想将新的@Max与现有#app/models/diy.rb class Diy < Activerecord::Base #schema id | summary | created_at | updated_at has_many :steps accepts_nested_attributes_for :steps end #app/controllers/diys_controller.rb class DiysController < ApplicationController def new @diy = Diy.new @diy.steps.build end def create @diy = Diy.new diy_params @diy.save end private def diy_params params.require(:diy).permit(steps_attributes: [:step_content]) end end #app/views/diys/new.html.erb <%= form_for @diy do |f| %> <%= f.fields_for :steps do |s| %> <%= s.number_field :step_count %> <% end %> <%= f.submit %> <% end %> 相关联,则需要填充Diycollection_singular_ids)属性:

Step