10

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

4

5 回答 5

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 仅防止大量分配变量,主要来自表单等。

于 2009-11-25T01:56:24.590 回答
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`.

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

于 2009-11-24T13:26:59.330 回答
7

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

于 2009-11-24T18:21:18.673 回答
1

当您指定某些东西时,attr_accessible只有那些东西可以在控制台或网站界面中访问。

例如:假设你做了name并且emailattr_accessible

attr_accessible :name, :email

并省略了created_atand updated_at(你应该这样做)。然后您只能在控制台中编辑/更新这些字段。

于 2011-08-25T12:07:30.617 回答
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

干杯。

于 2012-02-17T09:29:07.373 回答