0

如何attr_accessor工作ActiveResource

class User < ActiveResource::Base
 attr_accessor :name
end

它与attr_accessordActiveRecor有何不同?

4

2 回答 2

2

attr_accessor内置在 Ruby 中,而不是 Rails 中。您可能会将其与.attr_accessible的一部分混淆ActiveRecord。区别如下:

attr_accessor

上课:

class Dog
  attr_accessor :first_name, :last_name

  def initialize(first_name, last_name)
    self.first_name = first_name
    self.last_name = last_name
  end
end

attr_accessor创建一个属性并创建允许它可读和可写的方法。因此,上面的类将允许您这样做:

my_dog = Dog.new('Rex', 'Thomas')
puts my_dog.first_name     #=> "Rex"

my_dog.first_name = "Baxter"
puts my_dog.first_name     #=> "Baxter"

它创建了两种方法,一种用于设置值,一种用于读取值。如果你只想读写,那么你可以分别使用attr_readerattr_writer

attr_accessible

这是一个 ActiveRecord 特定的东西,看起来类似于attr_accessor. 但是,它的行为非常不同。它指定允许批量分配哪些字段。例如:

class User
  attr_accessible :name, :email
end

批量分配来自于将 POST 参数的散列传递给 Rails 控制器的neworcreate动作。然后将哈希值分配给正在创建的用户,例如:

def create
  # params[:user] contains { name: "Example", email: "..."}
  User.create(params[:user])
  #...
end

为了安全起见,attr_accessible必须使用 来指定允许批量分配的字段。否则,如果用户有admin标记,则有人可以将admin: true数据作为数据发布到您的应用程序,并让自己成为管理员。

总之

attr_accessor是 Ruby 类的辅助方法,而attr_accessibleRails 是 ActiveRecord 的东西,以加强安全性。

于 2013-05-28T12:35:18.207 回答
0

您不需要 attr_accessor 来使用 ActiveResource。基本模型 (ActiveResource::Base) 包含 @attributes 哈希,您可以在其中根据需要“转储”属性。(你应该小心你允许的参数)

它这样做的方式是通过处理method_missing?方法。你可以看看这里

如果您定义 attr_accessor,ruby 所做的就是创建一个 setter 和一个 getter 方法,因此它将破坏 method_missing 功能,因为它永远不会执行该代码。

如果你仍然想使用 attr_accessor,你应该创建一个像这样的关注:

模块属性扩展 ActiveSupport::Concern

  module ClassMethods
    def attr_accessor(*attribs)
      attribs.each do |a|

        define_method(a) do
          @attributes[a]
        end

        define_method("#{a}=") do |val|
          @attributes[a] = val
        end
      end
    end
  end
end
于 2014-02-23T15:04:49.870 回答