0

剛開始使用Rails 4.1,我很難理解當我嘗試使用update_attributes方法更新模型時發生的事情。我已經編寫了一個小應用程序來學習,讓用戶查看啤酒。用戶可以使用類似如下的表格編輯點評:Rails模型的某些屬性沒有被update_attributes方法更新

<%= form_for review do |f| %> 
<%= f.label :rating %> 
<%= f.select :rating, 1..5%> 
<%= f.label :review_text %> 
<%= f.text_area :review_text %> 
<%= hidden_field_tag :beer_id, @beer.id %> 
<%= hidden_field_tag :on_wishlist, "f" %> 
<%= f.submit %> 
<% end %> 

控制器有一個簡單的更新操作,看起來像這樣:

@review.update_attributes(review_params) 

,參數如下圖所示:

def review_params 
    params.require(:review).permit(:rating, :user_id, :beer_id, :review_text, :on_wishlist) 
end 

所有非常簡單。我不明白爲什麼這隻能更新一些屬性。特別是,on_wishlist屬性不會被更新。如果我查看服務器日誌,我會看到以下內容:

參數:{...「review」=> {「rating」=>「5」,「review_text」=>「真棒啤酒」 }, 「beer_id」=> 「4」, 「on_wishlist」=> 「F」, 「提交」=> 「更新評論」, 「ID」=> 「7」}

...

SQL(0.5ms)UPDATE「reviews」SET「rating」=?,「review_text」=?,「updated_at」=? WHERE「reviews」。「id」= 7 [[「rating」,5],[「review_text」,「What a good beer」],[「updated_at」,「2015-01-15 22:51:56.009256」] ]

因此,我可以看到on_wishlist隱藏字段正在發送到服務器,只是未包含在更新中,即使它在review_params哈希中。

如果我控制器代碼更改爲以下,正常工作:

@review.update_attributes(review_params) 
@review.on_wishlist = params[:on_wishlist] 
@review.save 

但我不明白爲什麼on_wishlist應該要分別對待。唯一相關的細節,我能想到的是,on_wishlist在從審查的其餘部分單獨的遷移增加,如下:

class AddOnWishlistToReviews < ActiveRecord::Migration 
    def change 
    add_column :reviews, :on_wishlist, :bool, :default => false 
    end 
end 

我敢肯定,我失去了一些東西簡單 - 您的幫助感謝。

回答

0

這是因爲您在形式中將beer_idon_wishlist定義爲單獨的字段。您使用對象格式f定義的其他字段。

你可以看到PARAMS被髮送到服務器,你只需要:

"review"=>{"rating"=>"5", "review_text"=>"What a good beer"} 

所以,你的對象@review只能更新這些字段。 review_params實際上是params[:review]

所以,如果你想更新beer_idon_wishlist,可以使這些領域屬於通過f對象的形式對象:

<%= f.hidden_field :beer_id, value: @beer.id %> 
<%= f.hidden_field :on_wishlist, value: "f" %> 

或改變他們的名字:

<%= hidden_field_tag :beer_id, @beer.id, name: 'review[beer_id]' %> 
<%= hidden_field_tag :on_wishlist, "f", name: 'review[on_wishlist]' %> 
+0

啊,我知道這很簡單,我忽略了。謝謝,我非常感謝幫助。 – dayman

相關問題