簡體   English   中英

attr_access在遷移中可訪問

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM