剛開始使用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
我敢肯定,我失去了一些東西簡單 - 您的幫助感謝。
啊,我知道這很簡單,我忽略了。謝謝,我非常感謝幫助。 – dayman