gpt4 book ai didi

ruby-on-rails - Ruby on Rails 嵌套模型未使用 form_for 更新,但更新时没有错误

转载 作者:数据小太阳 更新时间:2023-10-29 08:06:42 27 4
gpt4 key购买 nike

所以在我的 Rails 项目中,我有一个 Patient 类,它有一个 Treatment 类。这个治疗类里面有很多 DrNotes。我对 Rails 还是很陌生,我知道在 Rails 中不推荐深度嵌套,但我正在继续使用这种方法。

我的问题是编辑 DrNotes。由于治疗中有很多医生笔记,我试图只编辑一个特定的笔记。我正在使用 Form_for 将参数传递给医生的笔记。当我提交表单时,它会将我重定向到只有在更新功能成功时才应显示的页面。但是,实际上并没有更新任何注释,并且当我尝试执行更新时也没有抛出任何错误。

以下是有问题的模型:

病人.rb

class Patient < ApplicationRecord
has_one :treatment, dependent: :destroy

accepts_nested_attributes_for :treatment, update_only: true

end

治疗.rb

class Treatment < ApplicationRecord
belongs_to :patient

has_many :dr_notes, class_name: "DrNote",
foreign_key: "treatment_id", dependent: :destroy

accepts_nested_attributes_for :dr_notes
end

dr_note.rb

class DrNote < ApplicationRecord
belongs_to :treatment
end

在我的 Controller 中我有:

医生笔记编辑功能

def edit_dr_note
@patient = Patient.find(params[:patient_id])
@dr_note = @patient.treatment.dr_notes.find(params[:dr_id])
@dr_note.update if @dr_note.nil?
end

医生笔记更新功能

def update_dr_note
@patient = Patient.find(params[:patient_id])
@dr_note = @patient.treatment.dr_notes.find(params[:dr_id])
if @dr_note.update(dr_note_params)
redirect_to page_path(@patient)
else
flash.now[:error] = "Cannot update Doctor's notes"
render 'edit_dr_note'
end
end

医生笔记参数

def dr_note_params
params.require(:dr_note).permit(:id, :name, :message)
end

我在 params.permit 中有 :id 因为通过研究,我听说在更新模型时需要包含它,但我不确定这里是否需要它。

我在 routes.rb 中有以下代码

get '/pages/:patient_id/treatment/edit/edit_dr_note/:dr_id', to: 'pages#edit_dr_note', as: :edit_dr_note
match "pages/:patient_id/treatment/update/update_dr_note/:dr_id" => "pages#update_dr_note", as: :update_dr_note, via: [:patch, :post]

并在 edit_dr_note.html.erb 中

<%= form_for @patient.treatment.dr_notes.find(params[:dr_id]), url: update_dr_note_path do |patient_form| %>

<% @patient.treatment.dr_notes.each do |doctor| %>
<% if doctor.id == @dr_note.id %> #Only displays the fields for the desired note
<%= patient_form.fields_for :dr_note, doctor do |doctor_fields| %>
Name: <%= doctor_fields.text_field :name %>
Message: <%= doctor_fields.text_field :message %>
<% end %>
<p>
<%= patient_form.submit %>
</p>
<% end %>
<% end %>
<% end %>

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

您正在混合使用两种方法(嵌套资源嵌套属性)。使用一个服务于您的目的。

使用嵌套资源:

<%= form_for [:pages, @patient, @treatment, @dr_note], url: update_dr_note_path do |dr_note| %>
Name: <%= dr_note.text_field :name %>
Message: <%= dr_note.text_field :message %>
<p>
<%= dr_note.submit %>
</p>
<% end %>

路线是

get '/pages/:patient_id/treatment/:treatment_id/edit_dr_note/:dr_id', to: 'pages#edit_dr_note', as: :edit_dr_note
match "pages/:patient_id/treatment/:treatment_id/update_dr_note/:dr_id" => "pages#update_dr_note", as: :update_dr_note, via: [:patch, :post]

编辑edit_dr_note来定义@treatment

def edit_dr_note
@patient = Patient.find(params[:patient_id])
@treatment = @patient.treatment
@dr_note = @patient.treatment.dr_notes.find(params[:dr_id])
@dr_note.update if @dr_note.nil?
end

最后从模型中删除 accepts_nested_attribute_for,在这种方法中不需要它。

使用嵌套属性:

在模型中保留 accepts_nested_attributes_for。并像下面这样改变路线和形式

get '/edit_dr_note/:dr_id', to: 'pages#edit_dr_note', as: :edit_dr_note
match "/update_dr_note/:dr_id" => "pages#update_dr_note", as: :update_dr_note, via: [:patch, :post]

还有form_for

<%= form_for @patient, url: update_dr_note_path do |patient| %>
<%= patient.fields_for :treatment do |t| %>
<%= t.fields_for :dr_notes, @dr_note do |dr_note| %>
Name: <%= dr_note.text_field :name %>
Message: <%= dr_notetext_field :message %>
<% end %>
<% end %>
<p>
<%= patient.submit %>
</p>
<% end %>

然后如下更改dr_note_params方法

def dr_note_params
params.require(:patient).permit(:id, treatment_attributes: [:id, dr_notes_attributes: [:id, :name, :message])
end

关于ruby-on-rails - Ruby on Rails 嵌套模型未使用 form_for 更新,但更新时没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53167093/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com