[英]attr_accessible in migrations
我正在使用Rails 4th Edition(rails 3.2+)進行敏捷的Web開發,並且對migraitons有疑問。 在一個練習中,我必須向現有表中添加一列,然后使用值更新該新列。 我需要在“ line_items”表中添加“價格”列。 首先,我生成了遷移:
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中指定該新屬性。 任何和所有輸入將不勝感激。
基本上是因為在Rails表單中,您可以將任何字段添加到表單中。 如果用戶在表單中添加新參數並將其提交到服務器,則會給您帶來很大的問題。
像這樣:
您的控制器:
LineItem.create(params[:line_item)
如果這是您的控制器,則用戶(通過javascript或通過chrome上的控制台編輯)插入新的文本字段,則他可以修改受保護的字段。
這就是為什么我們使用attr_accessible
只允許違例字段。
因此, attr_accessible
中不可訪問的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,它具有很好的解釋
attr_accessible
控制您執行類似操作的能力
LineItem.create(:foo => bar)
some_line_item.update_attributes(:foo => bar)
控制器更新/創建方法通常會執行哪些操作。
它對
some_line_item.foo = bar
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.