当我从视图中保存has_many关系时,我将输入命名为什么?

时间:2016-11-18 03:43:38

标签: ruby-on-rails input ruby-on-rails-5 has-many-through

我正在使用Rails 5.我有这个模型

class Scenario < ApplicationRecord
  belongs_to :grading_rubric, optional: true
  has_many :confidential_memo
  has_many :scenario_roles, :dependent => :destroy
  has_many :roles, :through => :scenario_roles
    …
end

在我看来,我正在动态创建角色元素(在用户点击“添加”之后)。这些元素就是这样创建的......

<input size="30" validate="true" type="text" name="scenario[roles][name]" id="scenario_roles_name">

我的所有元素都是以上述方式创建的。当我提交表单时,参数将作为

提交
Parameters: {"utf8"=>"✓", "authenticity_token"=>"n2/51OSHlNP+1E7qnLku/gXtCjUk/MfMxwsrNpUirR2IbQddOzP1/OClL50ClCPvDNIowvdsqpVNmer37Egp4w==", "scenario"=>{"title"=>"title #1", "abstract"=>"abstract", "roles"=>{"name"=>"bbb"}}}

问题是,虽然保存了我的场景模型,但不会保存角色元素。以下是我试图保存它们的方法......

def create
@scenario = Scenario.new(scenario_params)
respond_to do |format|
  if @scenario.save
    puts "saved successfully."
    format.html { redirect_to new_scenario_confidential_memo_path(@scenario), notice: 'Saved successfully.' }
  else
    puts "full messages: #{@scenario.errors.full_messages}"
    format.html { render action: "new" }
  end
end
end

…
def scenario_params
  params.require(:scenario).permit(:title, :abstract, :scenario_roles)
end

我觉得我没有正确地命名我的输入元素,这就是角色没有保存的原因。如何命名我的元素以便保存?

1 个答案:

答案 0 :(得分:0)

正如Pavan指出的那样,你允许稍微离开。

每当我无法将表单中的数据导入模型时,我每次都会执行以下操作:

pp params
pp permitted_params
# assignment
pp model
# and in your case
pp model.collection
# save
pp model.errors

这通常也有帮助,因为打印允许的参数方法也会显示被列入黑名单的内容。

至于:

def scenario_params
  params.require(:scenario).permit(:title, :abstract, roles: [:name])
end

我倾向于将accepts_nested_attributes_for :roles添加到您的模型中,然后跟进这些参数:

def scenario_params
  params.require(:scenario).permit(:title, :abstract, roles_attributes: [:name])
end

Rails中有帮助方法来帮助管理这些类型的表单: http://guides.rubyonrails.org/form_helpers.html#nested-forms

以下是了解ActiveRecord部分的文档: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

但也许你不需要像这样做,我不确定。

对于嵌套关联发布和帮助方法的Rails 4.2中的示例应用程序,您可以使用它来生成您要查找的结构:

example app

您可以在互联网上找到基于RailsCasts第196集的内容: http://railscasts.com/episodes/196-nested-model-form-revised