【问题标题】:ActiveRecord: How to get all attributes of a model that can be mass-assigned?ActiveRecord:如何获取可以批量分配的模型的所有属性?
【发布时间】:2010-12-04 07:22:24
【问题描述】:

我想要一份可以批量分配的所有属性名称的列表。我需要一个自定义表单构建器,默认情况下不会添加无法批量分配的输入字段。

例如,如果我有以下型号:

class Post < ActiveRecord::Base
  attr_protected :account

  belongs_to :author

  validates_presence_of :title, :author
end

我想得到[:author, :title]

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    Post.accessible_attributes.to_a.map(&:to_sym)

    【讨论】:

    • 稍微解释一下会更好。
    • 来自审核队列:我可以请求您在您的答案周围添加更多上下文。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,这将对提问者和未来的读者都有帮助。
    【解决方案2】:

    对于模型,您可以使用 MyModel.attribute_namesMyModel.column_names

    例如,您可以使用MyModel.new.attribute_names

    【讨论】:

      【解决方案3】:

      随便用

      Post.accessible_attributes
      

      这将返回该类的所有attributes accessible

      【讨论】:

      • 请注意,如果使用多个角色,您可以通过传递符号来获取不同的列表 - Post.accessible_attributes(:user)Post.accessible_attributes(:admin) 等。我还发现 Post.active_authorizers 很有帮助,它返回一个哈希所有已定义角色及其可访问属性的集合。
      • 您使用的是哪个版本的 ruby​​?
      • 使用 Ruby 2.2.2; Rails 4.1.2:我有一个由数据库表支持的User 模型。对于User.accessible_attributes,我得到NoMethodError: undefined method "accessible_attributes" for #&lt;Class:0x007f9216346fe8&gt;
      • 我的 rails 版本 4.2.6 但它返回错误。但@Scudelletti 的回答有效。
      【解决方案4】:

      前面提到的一些答案可能不适用于 Rails 4。

      您可以使用MyModel.attribute_names 来获取表属性数组,但是,这可能不会为您提供大量可分配的属性,因为 Rails 的这一方面随着版本 4 http://weblog.rubyonrails.org/2012/3/21/strong-parameters/ 而发生变化

      【讨论】:

      • 这是我需要的,谢谢。我正在为一个模型禁用批量分配。 :-)
      【解决方案5】:

      如果您明确定义 attr_accessible,Post.accessible_attributes 将覆盖它

      除此之外,做这样的事情虽然笨拙但有效:

      Post.new.attributes.keys - Post.protected_attributes.to_a
      

      【讨论】:

      • 所以,如果accessible_attributes 获得明确attr_accessible'd 的那些,protected_attributes 获得明确attr_protect'd 的那些,有没有一种方法可以告诉你哪些是可访问的,无论它们是否是通过 attr_protected 或 attr_accessible 保护?
      • 感谢您的发帖。这是对我的过滤属性方法的一个很好的补充。
      • 有一个问题,这会将 :created_at, :updated_at 列为可访问属性!!,它们不是
      • @MhdSyrwan: 你确定你不是说 :created_at 和 :updated_at SHOULDN'T 可以访问而不是ARE NOT 吗?如果您通过 name="post[created_at]" 和 value="01/01/2012" 的输入,它不会进入模型吗?在这里。取决于您的 Rails 版本(在 Github/可访问属性丑闻之后,Rails 核心将更改默认值)。
      • @BrenoSalgado:你是对的 :) ,这取决于 Rails 版本chrisroos.co.uk/blog/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多