accepted_nested_attributes_for用于在rails中编辑api

时间:2018-02-07 13:20:44

标签: ruby-on-rails

我有一个纸质模型,有很多问题。我正在制作api。

在paper.rb

 has_many :questions, dependent: :destroy
 accepts_nested_attributes_for :questions, reject_if: :all_blank,allow_destroy: true

问题.rb

 belongs_to :paper

在paper_controller.rb

 def create
   paper = current_user.papers.create(paper_params)
   unless plan.blank?
     render json: {status: 'successful', paper: paper }, status: 201
   else
     render json: {error: 'Some thing went wrong'}, status: 401
   end
 end

 def update
   paper = Paper.find(params[:id])
   if paper.update_attributes(paper_params)
     render json: {status: 'successful', paper: paper }, status: 201
   else
     render json: {error: 'Some thing went wrong'}, status: 401
   end
 end

 private 

 def paper_params 
   params.require(:paper).permit(:subject,questions_attributes: [:id, :question])
 end

我的问题是每当我在特定论文中编辑问题时,问题都没有被编辑,但是形成了新的问题。例如,如果有3个问题并且我已发送编辑请求,则该论文将有6个问题。

1 个答案:

答案 0 :(得分:0)

<强>更新 对于JSON,有一个known issue。更多信息here

如果正在形成新问题,则意味着您的控制器无法找到现有的子问题。唯一可能发生的方法是,如果您没有为每个问题发送:id,那么问题不是您的控制器或模型,而是表单从客户端发送的内容。

如果您的表单使用javascript并提交json正文,您还应检查JSON结构是否有一个名为“questions_attributes”的子项,而不是“question_attributes”。

仅供参考,您不需要实际指定问题:如果您的ID是整数,则在许可证代码中输入ID(尽管您当然必须发送它以使更新生效)。

 def paper_params 
  params.require(:paper).permit(:id, :subject, questions_attributes: [:question])
 end

请参阅官方文档示例here。如果您的id不是整数(例如自定义,例如GUIDS,那么您确实需要它)。