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 %>
答案 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已经建议您也可以使用相同的格式来执行其余操作。