在Rails中,attr_accessor和attr_accessible之间的区别是什么?根据我的理解,使用attr_accessor用于为该变量创建getter和setter方法,以便我们可以像Object一样访问该变量。变量或对象。变量= some_value。

我读到attr_accessible使得外部世界可以访问特定的变量。 有人能告诉我有什么区别吗


当前回答

Attr_accessor是ruby代码,当数据库中没有列,但仍然想在表单中显示字段时使用。允许这样做的唯一方法是attr_accessor:fieldname,你可以在你的视图或模型中使用这个字段,如果你想的话,但主要是在你的视图中。

让我们考虑下面的例子

class Address
    attr_reader :street
    attr_writer :street  
    def initialize
        @street = ""
    end
end

这里我们使用了attr_reader(可读属性)和attr_writer(可写属性)进行访问。但我们可以使用attr_accessor实现相同的功能。简而言之,attr_accessor提供了对getter和setter方法的访问。

修改后的代码如下所示

class Address
    attr_accessor :street  
    def initialize
        @street = ""
    end
end

attr_accessible允许你列出所有你想要允许批量赋值的列。与此相反的是attr_protected,这意味着我不希望任何人被允许批量分配到这个字段。它很可能是数据库中的一个字段,您不希望任何人随意摆弄它。比如状态字段之类的。

其他回答

attr_accessor是一个Ruby方法,用于创建getter和setter。attr_accessible是一个Rails方法,允许您将值传递给一个质量赋值:new(attrs)或update_attributes(attrs)。

这是一个质量分配:

Order.new({ :type => 'Corn', :quantity => 6 })

您可以想象,订单可能还有一个折扣代码,例如:price_off。如果你没有将:price_off标记为attr_accessible,你可以阻止恶意代码这样做:

Order.new({ :type => 'Corn', :quantity => 6, :price_off => 30 })

即使你的表单没有一个字段:price_off,如果它在你的模型中,它默认是可用的。这意味着一个精心制作的POST仍然可以设置它。使用attr_accessible列出那些可以被大量分配的东西。

attr_accessor是一个Ruby方法,它为同名的实例变量提供setter和getter方法。所以它等于

class MyModel
  def my_variable
    @my_variable
  end
  def my_variable=(value)
    @my_variable = value
  end
end

attr_accessible是一个Rails方法,用于确定在质量分配中可以设置哪些变量。

当你提交一个表单时,你有一个类似MyModel的东西。New params[:my_model]然后你想要有更多的控制,这样人们就不能提交你不想让他们提交的东西。

您可以使用attr_accessible:email,这样当有人更新他们的帐户时,他们可以更改他们的电子邮件地址。但你不会使用attr_accessible:email,:salary,因为这样人们就可以通过表单提交来设置他们的工资。换句话说,他们可以通过黑客获得加薪。

这类信息需要明确地处理。仅仅从表单中删除它是不够的。有人可以使用firebug将元素添加到表单中以提交工资字段。他们可以使用内置的curl向控制器更新方法提交新的工资,他们可以创建一个脚本,提交带有该信息的帖子。

attr_accessor是关于创建存储变量的方法,attr_accessible是关于海量赋值的安全性。

一个快速而简洁的差异概述:

attr_accessor is an easy way to create read and write accessors in your class. It is used when you do not have a column in your database, but still want to show a field in your forms. This field is a “virtual attribute” in a Rails model. virtual attribute – an attribute not corresponding to a column in the database. attr_accessible is used to identify attributes that are accessible by your controller methods makes a property available for mass-assignment.. It will only allow access to the attributes that you specify, denying the rest.

Attr_accessor是ruby代码,当数据库中没有列,但仍然想在表单中显示字段时使用。允许这样做的唯一方法是attr_accessor:fieldname,你可以在你的视图或模型中使用这个字段,如果你想的话,但主要是在你的视图中。

让我们考虑下面的例子

class Address
    attr_reader :street
    attr_writer :street  
    def initialize
        @street = ""
    end
end

这里我们使用了attr_reader(可读属性)和attr_writer(可写属性)进行访问。但我们可以使用attr_accessor实现相同的功能。简而言之,attr_accessor提供了对getter和setter方法的访问。

修改后的代码如下所示

class Address
    attr_accessor :street  
    def initialize
        @street = ""
    end
end

attr_accessible允许你列出所有你想要允许批量赋值的列。与此相反的是attr_protected,这意味着我不希望任何人被允许批量分配到这个字段。它很可能是数据库中的一个字段,您不希望任何人随意摆弄它。比如状态字段之类的。

两个字:

Attr_accessor是getter, setter方法。 而attr_accessible表示特定属性是否可访问。就是这样。


我想补充的是,我们应该使用Strong参数而不是attr_accessible来防止大量分配。

干杯!