如何attr_accessor
工作ActiveResource
?
class User < ActiveResource::Base
attr_accessor :name
end
它与attr_accessor
dActiveRecor
有何不同?
如何attr_accessor
工作ActiveResource
?
class User < ActiveResource::Base
attr_accessor :name
end
它与attr_accessor
dActiveRecor
有何不同?
attr_accessor
内置在 Ruby 中,而不是 Rails 中。您可能会将其与.attr_accessible
的一部分混淆ActiveRecord
。区别如下:
上课:
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_reader
和attr_writer
。
这是一个 ActiveRecord 特定的东西,看起来类似于attr_accessor
. 但是,它的行为非常不同。它指定允许批量分配哪些字段。例如:
class User
attr_accessible :name, :email
end
批量分配来自于将 POST 参数的散列传递给 Rails 控制器的new
orcreate
动作。然后将哈希值分配给正在创建的用户,例如:
def create
# params[:user] contains { name: "Example", email: "..."}
User.create(params[:user])
#...
end
为了安全起见,attr_accessible
必须使用 来指定允许批量分配的字段。否则,如果用户有admin
标记,则有人可以将admin: true
数据作为数据发布到您的应用程序,并让自己成为管理员。
attr_accessor
是 Ruby 类的辅助方法,而attr_accessible
Rails 是 ActiveRecord 的东西,以加强安全性。
您不需要 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