如何更新 rails 中的@model.submodel 6

How to update @model.submodel in rails 6

我尝试更新子模型失败,不知何故嵌套但得到异常结果。

背景(向下滚动查看问题):

更新 reviews 模型的布尔值 verified 以关联翻译是否经过验证,以及翻译 entryuser 模型关联参考。有关创建验证的详细信息

# 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