最近在學習Ruby on Rails…
開始按照書上的例子程序搭建系統.
第八章完成以后.保存了版本.然后開始興致高昂的進入第九章.添加一個Add to Cart 按鈕這一小節.
順利的step by step 完成了界面以及后台代碼的改寫.
運行起服務器
當我點擊頁面的 Add to Cart的時候結果卻不是希望的那樣.
# POST /line_items
# POST /line_items.json
def create
#@line_item = LineItem.new(params[:line_item])
@cart = current_cart
product = Product.find(params[:product_id])
@lint_item = @cart.line_items.build(:product => product)
respond_to do |format|
if @line_item.save
...........
在頁面就報錯了:
ActiveModel::MassAssignmentSecurity::Error in LineItemsController#create
Can’t mass-assign protected attributes: product
基於這個錯誤我去谷歌了一把.
看到了這樣的一個網頁
http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html#method-i-accessible_attributes
應為根據報錯的內容,我懷疑是line_item不能獲取到product.接下來我修改了 line_item.rb的model
class LineItem < ActiveRecord::Base attr_accessible :cart_id, :product_id attr_accessible :product belongs_to :product belongs_to :cart end
點擊按鈕還是報錯了.這回不是product protected了
NoMethodError in LineItemsController#create
undefined method `save’ for nil:NilClass
再次谷歌一把.在一個英文的帖子發現了同樣的問題.閱讀了一下網友的回復找到了解決辦法
問題還是出在@lint_item = @cart.line_items.build(:product => product)這句話
修改line_items_controller.rb文件,將@lint_item = @cart.line_items.build(:product => product)替換為
@line_item = @cart.line_items.build @line_item.product = product
通過以上修改就能正確的運行新添加的功能.具體的原因我還在思考..如果您知道歡迎你在下面留言.
http://guides.rubyonrails.org/security.html#mass-assignment
為了安全考慮,如果允許mass-assignment的話,可以通過鏈接往數據庫里插入數據,我也看到這一章碰到同樣的問題了
所以默認不可以直接用build來new這個新對象,除非你加上
attr_accessible :product,:cart
顯示告訴他們你允許mass-assignment
