rails Active Record中的attr_accessible

时间:2009-11-24 13:17:30

标签: ruby-on-rails ruby activerecord attr-accessible

当我使用attr_accessible指定模型I中的哪些字段将公开时,脚本/控制台是否也是如此?我的意思是我没有指定的东西,attr_accessible也无法通过控制台访问?

5 个答案:

答案 0 :(得分:19)

这仅适用于群发作业。例如,如果您要在模型中设置attr_protected :protected

>> Person.new(:protected => "test")
=> #<Person protected: nil>

相反,您可以使用attr_accessible将所需的所有属性设置为可访问。

但是,以下内容仍然有效:

>> person = Person.new
=> #<Person protected: nil>
>> person.protected = "test"
=> #<Person protected: "test">

这与控制器,视图等行为相同。attr_protected 仅防止大量分配变量,主要来自表单等。

答案 1 :(得分:7)

我找到了原因:

指定可通过质量分配设置的模型属性的白名单,例如new(attributes)update_attributes(attributes)attributes=(attributes)。 这与attr_protected宏相反:

 Mass-assignment will only set attributes in this list, to assign to the rest of 
attributes you can use direct writer methods. This is meant to protect sensitive  
attributes from being overwritten by malicious users tampering with URLs or forms. 
If you‘d rather start from an all-open default and restrict attributes as needed,
have a look at `attr_protected`.

所以这意味着它只是避免了质量分配,但我仍然可以设置一个值。

答案 2 :(得分:7)

控制台的行为与Rails应用程序完全相同。如果您保护特定模型的某些属性,您将无法从控制台或Rails应用程序本身批量分配这些属性。

答案 3 :(得分:1)

当您指定某些事物为attr_accessible时,只能在控制台或网站界面中访问这些内容。

例如:假设您将nameemail设为attr_accessible

attr_accessible :name, :email

并遗漏了created_atupdated_at(您应该这样做)。 然后,您只能在控制台中编辑/更新这些字段。

答案 4 :(得分:0)

如果要在模型中公开字段,可以使用

attr_accessor :meth # for getter and setters
attr_writer :meth # for setters
attr_reader :meth # for getters

或者如果您想为属性添加一些行为,则必须使用虚拟属性

def meth=(args)
 ...
end
def meth
 ...
end

欢呼声。