我正在制作一个目标跟踪应用。现在,结果,目的,行动,优先级,资源和方向都是数据库中结果的一部分。但是,我想让目的和动作成为他们自己的模型对象。我感到困惑的是如何在一个HTTP请求中提交Outcome,Purpose和Action,它们将是3个独立的模型对象?
我应该在控制器中使用多个强参数吗?
应用/视图/结果/ new.html.erb
答案 0 :(得分:1)
您需要将outcomes
与purpose
和action
建立模型关联。
然后您需要创建嵌套表单。因此outform
表单可以包含purpose
和action
模型属性。
由于您希望为actions
和purposes
设置不同的模型,我假设outcome
可以has_many purposes
和has_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 %>
-
<强>建议强>
从它的外观来看,我建议你能够将所有这些细节保存在单一模型中 - 存储在多个模型中似乎有点过分