【问题标题】:Rails error: Can't mass-assign protected attributesRails 错误:无法批量分配受保护的属性
【发布时间】:2012-04-07 00:55:43
【问题描述】:

我正在尝试构建一个极其简单的 AddressBook rails 应用程序。但是,我收到此错误“无法批量分配受保护的属性:city_id”。我怎样才能解决这个问题?请随时在您对以下 rails 代码的回答中添加任何评论/建议。谢谢。

我是如何创建项目的(从头开始):

rails new demo
rails generate model City name:string
rails generate scaffold User name:string city:references
rake db:migrate

db/seeds.db:

City.create(name: "City1")
City.create(name: "City2")
City.create(name: "City3")

耙分贝:种子

将此行 <%= f.text_field :city %> 从 app/views/users/_form.html.erb 更改为 <%= f.collection_select :city_id, City.all, :id, :name %>

将user.rb 自动生成的行belongs_to :city 更改为has_one :city。

将belongs_to :city 添加到city.rb

P.S:我使用的是 Rails 3.2.3 和 Ruby 1.9.3。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    有一个重要的安全更改 rails 3.2.3 要求您通过将 config.active_record.whitelist_attributes 设置为 false 来明确允许批量分配

    https://weblog.rubyonrails.org/2012/3/30/ann-rails-3-2-3-has-been-released/

    http://www.h-online.com/security/news/item/Rails-3-2-3-makes-mass-assignment-change-1498547.html

    或者(更好),您只需为模型中您希望能够更改的属性设置attr_accessible,而不是允许批量分配,例如

    attr_accessible :city_id, :name # list all fields that you want to be accessible here
    

    请查看rails security guide,了解有关 Rails 中质量分配的更多信息。

    【讨论】:

    • 将whitelist_attributes 设置为true 是新的默认值——这将要求您显式使用attr_accessible。如果你想恢复到旧的行为,你应该将whitelist_attributes设置为false。
    • 如果我在 schema.rb 中使用 ActiveRecord::Schema.define 添加模型,如何添加 attr_accessible
    • 别这样,坦率的暴雪。更多信息请查看github.com/rails/rails/issues/5228。
    • 如果我了解到有关 Rails 的一件事,就是它们具有合理的默认值。我会确保在更改默认设置之前对此进行研究。
    • 唷,感谢您提供的详细信息。 “Whitelist_attributes”必须是有史以来最糟糕的名称,我确信将其设置为 true 会默认打开所有内容...
    【解决方案2】:

    或者你可以改变

    config.active_record.mass_assignment_sanitizer = :strict 
    

    到

    config.active_record.mass_assignment_sanitizer = :logger 
    

    我不知道为什么必须更改为:logger,但这是错误的解决方案。

    【讨论】:

    • 语法混乱的澄清:config.active_record.mass_assignment_sanitizer = :strict这行应该改成config.active_record.mass_assignment_sanitizer = :logger
    【解决方案3】:

    只需将模型中的数据字段包含为:

    attr_accessible :city_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多