如何更新 rails 中的@model.submodel 6
How to update @model.submodel in rails 6
我尝试更新子模型失败,不知何故嵌套但得到异常结果。
背景(向下滚动查看问题):
更新 reviews
模型的布尔值 verified
以关联翻译是否经过验证,以及翻译 entry
和 user
模型关联参考。有关创建验证的详细信息
# routes.rb
resources :entries do
resources :reviews
end
# entry.rb
belongs_to :user
has_one :review
accepts_nested_attributes_for :review
# user.rb
has_many :entries
has_many :reviews
# review.rb
belongs_to :user
belongs_to :entry
从 entry
索引,将 entry
实例传递给编辑部分,效果完美
# /entries/index.html.erb
<% @entries.each do |entry| %>
...
<% if entry.review %>
<%= render 'reviews/edit', entry: entry %>
<% end %>
...
<% end %>
_edit.html.erb
形式似乎是正确的...
# reviews/_edit.html.erb
<span>
<%= form_for([entry, entry.review]) do |f| %>
<div class="form-check form-switch">
<%= f.check_box :verified, class: "form-check-input" %>
</div>
<%= f.submit class: "btn btn-primary"%>
<% end %>
</span>
在浏览器控制台中,模型 entry
已正确分配。而且关联 entry.review
分配得很好,即
>> entry.review
=> #<Review id: 4, user_id: 1, entry_id: 19,
verified: false, created_at: "2021-02-18 03:43:27",
updated_at: "2021-02-18 14:31:15">
即使使用 Ruby on Rails 6
已弃用的方法 update_attribute
也有效
>> entry.review.update_attribute(:verified, false)
=> true
问题: reviews_controller.rb
中的 update
方法在 verified
为 true
时执行成功,但在 true
时执行失败 false
# reviews_controller.rb
def update
@entry.review.update(review_params)
end
private
def review_params
params.require(:review).permit(:verified, user: current_user, entry: @entry)
end
有效
{"_method"=>"patch", "authenticity_token"=>"...",
"review"=>{"verified"=>"1"}, "commit"=>"Update Review"}
但不是
{"_method"=>"patch", "authenticity_token"=>"...",
"review"=>{"verified"=>"0"}, "commit"=>"Update Review"}
我想我在@yzalavin 的建议下发现了问题。验证以某种方式阻止了更新。我还不知道协会。
只需添加 on: :create
即可更新。
validates_presence_of :entry_id, :user_id, :verified, on: :create
我尝试更新子模型失败,不知何故嵌套但得到异常结果。
背景(向下滚动查看问题):
更新 reviews
模型的布尔值 verified
以关联翻译是否经过验证,以及翻译 entry
和 user
模型关联参考。有关创建验证的详细信息
# routes.rb
resources :entries do
resources :reviews
end
# entry.rb
belongs_to :user
has_one :review
accepts_nested_attributes_for :review
# user.rb
has_many :entries
has_many :reviews
# review.rb
belongs_to :user
belongs_to :entry
从 entry
索引,将 entry
实例传递给编辑部分,效果完美
# /entries/index.html.erb
<% @entries.each do |entry| %>
...
<% if entry.review %>
<%= render 'reviews/edit', entry: entry %>
<% end %>
...
<% end %>
_edit.html.erb
形式似乎是正确的...
# reviews/_edit.html.erb
<span>
<%= form_for([entry, entry.review]) do |f| %>
<div class="form-check form-switch">
<%= f.check_box :verified, class: "form-check-input" %>
</div>
<%= f.submit class: "btn btn-primary"%>
<% end %>
</span>
在浏览器控制台中,模型 entry
已正确分配。而且关联 entry.review
分配得很好,即
>> entry.review
=> #<Review id: 4, user_id: 1, entry_id: 19,
verified: false, created_at: "2021-02-18 03:43:27",
updated_at: "2021-02-18 14:31:15">
即使使用 Ruby on Rails 6
已弃用的方法 update_attribute
也有效
>> entry.review.update_attribute(:verified, false)
=> true
问题: reviews_controller.rb
中的 update
方法在 verified
为 true
时执行成功,但在 true
时执行失败 false
# reviews_controller.rb
def update
@entry.review.update(review_params)
end
private
def review_params
params.require(:review).permit(:verified, user: current_user, entry: @entry)
end
有效
{"_method"=>"patch", "authenticity_token"=>"...",
"review"=>{"verified"=>"1"}, "commit"=>"Update Review"}
但不是
{"_method"=>"patch", "authenticity_token"=>"...",
"review"=>{"verified"=>"0"}, "commit"=>"Update Review"}
我想我在@yzalavin 的建议下发现了问题。验证以某种方式阻止了更新。我还不知道协会。
只需添加 on: :create
即可更新。
validates_presence_of :entry_id, :user_id, :verified, on: :create