控制器不接受参数值,但接受硬编码的相同值

时间:2014-05-27 20:38:15

标签: ruby-on-rails ruby-on-rails-4 params

Rails.logger.info(params[:question])
=> {"title"=>"katt"}

@question_list.questions.create(params[:question])
=> ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError)    

 @question_list.questions.create("title"=>"katt")
# SUCCES!

我无法理解为什么当手写的完全相同的值工作正常时,Rails不接受参数?

更新
控制器:

def new_question
  @question_list.questions.create(params[:question])
  render nothing: true
end

private
  def set_question_list
    @question_list = QuestionList.find(params[:id])
  end

  def question_list_params
    params.require(:question_list).permit(questions_attributes: [:id, :question_list_id, :title, :position, :_destroy])
  end

观点:

<%= form_for @question_list, url: new_question_question_list_path, remote: true do |f| %>
  <%= f.text_field :title %>
  <%= f.submit %>
<% end %>

3 个答案:

答案 0 :(得分:1)

这是一个名为强参数的Rails 4新功能。检查一下:http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

您需要在控制器中启用属性。尝试类似的东西:

  

class QuestionListsController&lt; ApplicationController中

     

def create

...

@question_list.questions.create(question_params)
     

     

...

     

私有

     

def question_params

params.require(:question).permit(:title)
     

     

答案 1 :(得分:1)

使用Rails 4,您需要将要保存在数据库中的属性列入白名单,这些属性是强参数的全部内容。因此,@question_list.questions.create(params[:question])无法在控制器中运行,并且会导致ActiveModel::ForbiddenAttributesError

QuestionList has_many Questions,并且您正在尝试实现嵌套属性,首先应该从修复表单开始,因为那里没有嵌套属性。查看question_list_params,我可以说Question模型有一个名为title的字段,因此,您的表单应该类似于:

<%= form_for @question_list, url: new_question_question_list_path, remote: true do |f| %>
  <%= f.fields_for :questions do |ff| %>
    <%= ff.text_field :title %>
  <% end %>
  <%= f.submit %>
<% end %> 

您可以做的下一件事是更新new_question方法,如下所示:

def new_question
  @question_list.update(question_list_params)
  render nothing: true
end

@question_list.update(question_list_params)将负责更新question_list记录加上question的嵌套属性。

有关示例,请参阅 Active Record Nested Attributes For One-To-Many Association

答案 2 :(得分:0)

仅供参考:

#Create question and it's options including correct answers.
def create

    if params[:question].present?      
      @question = Question.create(question_params)     
    else
      message("Failed", "400", "Parameter missing!", "Invalid parameters")
    end

end

private  

def question_params
      params.require(:question).permit(:word_id, :question_string, :level, :answers_attributes => [ :answer_string, :is_correct_choice])
end

我希望它能帮助您调试代码。并且正如@kirti已经建议您也可以使用相同的格式来执行其余操作。