【发布时间】:2021-11-15 08:29:09
【问题描述】:
我正在构建一个应用程序,在该应用程序中,我使用嵌套属性在问题记录下存储不同的选项记录。有一个表单,用户可以在其中动态添加和删除选项。在我的创建操作中一切正常,但在更新操作中,如果我删除现有选项并提交表单,它不会从数据库中删除。
在更新问题记录时,有没有办法完全覆盖现有的嵌套参数,并用我们在更新请求中传入的参数替换?
我了解将_destroy 添加到属性并将其作为参数传递将满足我的要求。由于我在按下 UI 中的“删除”按钮时从我的前端状态中删除选项信息,因此我不会将其与参数一起发送。 Rails 中是否有其他方法可以从控制器本身的更新操作中完全覆盖嵌套属性并删除更新请求中未传递的那些嵌套记录?
问题.rb
class Question < ApplicationRecord
belongs_to :quiz
has_many :options
validates :body, presence: true
accepts_nested_attributes_for :options
end
option.rb
class Option < ApplicationRecord
belongs_to :question
validates :body, presence: true
validates :is_correct, inclusion: { in: [ true, false ], message: "must be true or false" }
end
questions_controller.rb
class QuestionsController < ApplicationController
...
def update
@question = Question.find_by(id: params[:id])
if @question.update(question_params)
render status: :ok, json: { notice: t("question.successfully_updated") }
else
render status: :unprocessable_entity, json: { error: @question.errors.full_messages.to_sentence }
end
end
...
private
def question_params
params.require(:question).permit(:body, :quiz_id, options_attributes: [:id, :body, :is_correct])
end
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-6.1