2012-07-19 54 views
2

我正在通過使用rails第4版(rails 3.2+)的敏捷web開發工作,並且有一個關於migraitons的問題。有一個練習,我必須將列添加到現有表中,然後使用值更新該新列。我需要在'line_items'表中添加'價格'列。首先,我產生的遷移:attr_accessible在遷移

rails generate migration add_price_to_line_items price:decimal 

然後我編輯了遷移文件:

class AddPriceToLineItems < ActiveRecord::Migration 
    def change 
    add_column :line_items, :price, :decimal 

    LineItem.all.each do |li| 
     li.price = li.product.price 
    end 
    end 

    def down 
    remove_column :line_items, :price 
    end 
end 

一切工作按計劃進行,但是,我有一個關於attr_accessible問題。我的理解是,對象的所有屬性都需要在attr_accessible中指定才能編輯。如果沒有,你通常會得到這樣的錯誤:

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: product 

因此,所有屬性必須被設置爲在相關模型attr_accessible的參數:

class LineItem < ActiveRecord::Base 
    **attr_accessible :cart_id, :product_id, :quantity** 
    belongs_to :cart 
    belongs_to :product 

    def total_price 
    product.price * quantity 
    end 

end 

如果這是真的,那麼如何爲我的移民能夠更新新生成的列?如果該列剛剛生成,那麼該新屬性將不會在關聯模型的attr_accessible中指定。任何和所有的輸入將不勝感激。

回答

3

Basicaly沒有影響那是因爲在軌形成,你可以任意字段添加到表單。如果用戶向表單添加新參數並將其提交給服務器,它可能會給您帶來很大的問題。

像這樣:

控制器:

LineItem.create(params[:line_item) 

,如果這是你的控制器的用戶接入(通過JavaScript或通過鍍鉻控制檯編輯)一個新的文本框,他可以修改受保護的領域。

那就是爲什麼我們使用attr_accessible只允許defioned字段。

所以不在attr_accessible中的屬性仍然可以訪問,只是無法進行批量分配。

你仍然可以做這樣的事情:

模型名稱,時間和日期:

attr_accessible :name, :time 

控制器或任何類別:

您可以:

m = Model.new(:name => "name", :time => "time") 
m.date = "date" 
m.save 

您不能:

m = Model.new(:name => "name", :time => "time", :date = "date") 
m.save 

如果您還不明白檢查此鏈接http://ruby.railstutorial.org/chapters/modeling-users#sec:accessible_attributes它有一個很好的解釋

2

attr_accessible控制你做的事情一樣

LineItem.create(:foo => bar) 
some_line_item.update_attributes(:foo => bar) 

這是什麼控制器升級/創建方法通常做的能力。

它有

some_line_item.foo = bar