Rails:如何将多个对象提交到强对数中?

时间:2014-07-30 07:46:27

标签: ruby-on-rails

我正在制作一个目标跟踪应用。现在,结果,目的,行动,优先级,资源和方向都是数据库中结果的一部分。但是,我想让目的和动作成为他们自己的模型对象。我感到困惑的是如何在一个HTTP请求中提交Outcome,Purpose和Action,它们将是3个独立的模型对象?

我应该在控制器中使用多个强参数吗?

应用/视图/结果/ new.html.erb app/view/outcomes/new.html.erb

2 个答案:

答案 0 :(得分:1)

您需要将outcomespurposeaction建立模型关联。

然后您需要创建嵌套表单。因此outform表单可以包含purposeaction模型属性。

由于您希望为actionspurposes设置不同的模型,我假设outcome可以has_many purposeshas_many actions。根据这种类型的关联,下面是您应该拥有的代码。

您的表单会变成:

<%= form_for @outcome do |f| %>
  <%= f.label :outcome, "Outcome" %>
  <%= f.text_area :outcome %>

  <%= f.fields_for :purpose, @outcome.purpose.build do |p| %>
    <%= p.text_area :desc, label: "Purpose" %>
  <% end %>
  <%= f.fields_for :action, @outcome.action.build do |p| %>
    <%= p.text_area :desc, label: "Action" %>
  <% end %>

  <%= f.submit "submit" %>
<% end %>

型号:

# outcome.rb
has_many :purposes, :dependent => :destroy
has_many :actions, :dependent => :destroy

accepts_nested_attributes_of :purposes, :actions

-----------------------------------------

# purpose.rb
belongs_to :outcome

-----------------------------------------

# action.rb
belongs_to :outcome

控制器:

# outcomes_controller.rb
def outcome_params
    params.require(:outcome).permit(:outcome, purpose_attributes:[:desc], action_attributes: [:desc])
end

建议:您应重命名action型号名称,以避免与rails关键字action发生意外冲突。

这可能help

答案 1 :(得分:1)

嵌套属性

如果关联对象(如下所示),您最好使用accepts_nested_attributes_for方法:

#app/models/outcome.rb
Class Outcome < ActiveRecord::Base
   has_many :purposes
   has_many :actions

   accepts_nested_attributes_for :purposes, :actions
end

#app/models/purpose.rb
Class Purpose < ActiveRecord::Base
   belongs_to :outcome
end 

#app/models/action.rb
Class Action < ActiveRecord::Base
   belongs_to :outcome
end

accepts_nested_attributes_for表示您可以通过 Outcome模式发送关联的对象 - 这意味着您可以将它们全部发送出去在单个HTTP请求中

你必须记住Rails的设置方式(MVC pattern),这意味着如果你发送一个请求;您拥有的任何其他模型对象也将被存储。

以下是如何进行设置的方法:

#app/controllers/outcomes_controller.rb
Class OutcomesController < ApplicationController
   def new
      @outcome = Outcome.new
      @outcome.purposes.build
      @outcoe.actions.build
   end

   def create
      @outcome = Outcome.new(outcome_params)
      @outcome.save
   end

   private

   def outcome_params
       params.require(:outcome).permit(:outcome, purpose_attributes:[:purpose], action_attributes: [:action])
   end
end

这将使您能够使用此表单:

#app/views/outcomes/new.html.erb
<%= form_for @outcome do |f| %>

   <%= f.label :outcome %>
   <%= f.text_area :outcome %>

   <%= f.fields_for :purposes do |p| %>
      <%= p.text_area :purpose %>
   <% end %>

   <%= f.fields_for :actions do |a| %>
      <%= a.text_area :action %>
   <% end %>

   <%= f.submit %>

<% end %>

-

<强>建议

从它的外观来看,我建议你能够将所有这些细节保存在单一模型中 - 存储在多个模型中似乎有点过分