Rails嵌套的params无法正常工作

时间:2016-06-28 03:48:15

标签: ruby-on-rails

我有一个问题模型和答案模型:

class Question < ActiveRecord::Base
  has_many :answers
  accepts_nested_attributes_for :answers
end

以下是我发送给QuestionsController的#update电话的参数:

{"id"=>"1", "text"=>"Hello world?", 
"answers"=>[{"id"=>1, "text"=>"Answer 4", "question_id"=>1]}

非常简单。更新方法:

def update
    @question = Question.find(params[:id])
    if @question.update(q_params)
      render :json => @question
    else
      not_valid @question
    end
  end

现在,我在这里遇到了悲惨的问题:我想将这些参数列入白名单。我无法控制参数名称,因此我无法将answers重命名为answers_attributes。我发现的唯一有用的东西,有点荒谬,就是:

  def q_params
    p = ActiveSupport::HashWithIndifferentAccess.new(params)
    p[:answers_attributes] = p.delete :answers
  end

我真的想以正确的方式做到这一点,仅使用permit。这是我尝试过的一系列行,其中没有一行有效:

params.permit(:text, {:answers_attributes => [:text]})
# or
permitted = [:text, answers_attributes: [:id, :text]]
params.permit(*permitted)
# or
params.permit(:text, {:answers => [:text]})

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

试试这个

def question_params
  params.require(:question).permit(:id, :text, answers_attributes: [:id, :text])
end

和更新

def update
  @question = Question.find(params[:id])
  if @question.update_attributes(question_params)
    render :json => @question
  else
    not_valid @question
  end
end

编辑:

使用accepts_nested_attributes_for :answersquestion_form.fields_for :answers do |answer_form|将生成您所寻找的associations_attributes参数。

  

期待question_formform_for @question do |question_form

相似