我正在使用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
我觉得我没有正确地命名我的输入元素,这就是角色没有保存的原因。如何命名我的元素以便保存?
答案 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中的示例应用程序,您可以使用它来生成您要查找的结构:
您可以在互联网上找到基于RailsCasts第196集的内容: http://railscasts.com/episodes/196-nested-model-form-revised