为什么在同一个字段上同时使用attr_accessor和attr_accessible?

时间:2011-04-05 07:54:47

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

attr_accessor :password  
attr_accessible :name, :password, :password_confirmation  

3 个答案:

答案 0 :(得分:6)

attr_accessor定义了一个属性,是Ruby的一部分。更多here

attr_accessible使一个属性可用于批量分配,并且是Rails的一部分。更多here

答案 1 :(得分:5)

我假设您在Rails项目中使用了身份验证库。密码可能是Rails模型中的“虚拟属性”(例如,数据库表中没有密码列)。您需要使用密码访问器方法将纯文本密码保存在实例变量中,然后可能有一个回调方法,当您的模型可能在另一列中保存在数据库中时,该方法会加密/散列该密码。

答案 2 :(得分:3)

例如,假设您的数据库有一个名为posts的表。 posts包含以下字段: nameencrypted_password。你必须遵循Rails模型:

class Post < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :name, :password, :password_confirmation
end

如果没有attr_accessible,就可以通过质量分配设置encrypted_password。基本上使用attr_accessible,您可以指定可以通过质量分配设置哪些属性(在这种情况下,将encrypted_pa​​ssword保留在循环之外。

attr_accessor在您的类上为给定的名称/符号创建访问器。基本上它为你做的是:

def password= param
  @password = param
end

def password
  @password
end

我猜你的情况是attr password用于before_save / create回调。使用password执行某些操作并设置encrypted_password。但我只是在这里猜测。

希望有所帮助!