attr_accessor
如何在ActiveResource
中运作?
class User < ActiveResource::Base
attr_accessor :name
end
它与attr_accessor
d中的ActiveRecor
有什么不同?
答案 0 :(得分:2)
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
和attr_accessor
。
这是一个与class User
attr_accessible :name, :email
end
类似的ActiveRecord特定内容。但是,它的表现非常不同。它指定允许哪些字段进行质量分配。例如:
new
批量分配来自将POST参数的散列传递到Rails控制器的create
或def create
# params[:user] contains { name: "Example", email: "..."}
User.create(params[:user])
#...
end
操作。然后将散列的值分配给正在创建的用户,例如:
attr_accessible
出于安全考虑,必须使用admin
来指定允许批量分配的字段。否则,如果用户有admin: true
标记,则有人可以将attr_accessor
作为数据发布到您的应用中,并使自己成为管理员。
attr_accessible
是Ruby类的辅助方法,而{{1}}是rails的ActiveRecord,可以加强安全性。
答案 1 :(得分:0)
您无需使用attr_accessor即可使用ActiveResource。 基本模型(ActiveResource :: Base)包含@attributes哈希,您可以根据需要“转储”属性。 (你应该小心,但你应该允许什么样的参数)
这样做的方法是处理method_missing?方法。 你可以看看here
如果定义了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