attr_accessor如何在ActiveResource rails 3中运行?

时间:2013-05-28 12:24:35

标签: ruby-on-rails ruby ruby-on-rails-3

attr_accessor如何在ActiveResource中运作?

class User < ActiveResource::Base
 attr_accessor :name
end

它与attr_accessor d中的ActiveRecor有什么不同?

2 个答案:

答案 0 :(得分:2)

attr_accessor内置于Ruby中,而不是rails。您可能会将其与attr_accessible混淆,ActiveRecordclass 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

上课:

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_writerattr_accessor

attr_accessible

这是一个与class User attr_accessible :name, :email end 类似的ActiveRecord特定内容。但是,它的表现非常不同。它指定允许哪些字段进行质量分配。例如:

new

批量分配来自将POST参数的散列传递到Rails控制器的createdef 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