gpt4 book ai didi

ruby-on-rails - 迁移中的 attr_accessible

转载 作者:行者123 更新时间:2023-12-02 22:35:10 26 4
gpt4 key购买 nike

我正在使用 Rails 第 4 版(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 表单中,您可以向表单添加任何字段。如果用户向表单添加新参数并将其提交到您的服务器,这会给您带来很大的问题。

像这样:

你的 Controller :

LineItem.create(params[:line_item)

如果这是您的 Controller ,则用户插入(通过 javascript 或通过 chrome 上的控制台编辑)一个新的文本字段,他可以修改 protected 字段。

这就是为什么我们使用 attr_accessible 只允许定义的字段。

因此 attr_accessible 中没有的属性仍然可以访问,只是无法进行批量分配。

你仍然可以这样做:

模型有姓名、时间和日期:

attr_accessible :name, :time

Controller 或任何类:

您可以:

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它有很好的解释

关于ruby-on-rails - 迁移中的 attr_accessible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11560625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com