2009-11-24 5 views
10

Когда я использую attr_accessible, чтобы указать, какие поля из моей модели будут отображаться, верно ли это для скрипта/консоли? Я имею в виду то, что я не указал, поскольку attr_accessible не будет доступен также через консоль?attr_accessible in rails Активная запись

ответ

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защищает только от массового назначения переменных, в основном из форм и т.д.

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`. 

Так это означает, что он просто избежать массового назначения, но я до сих пор можно установить значение.

7

Консоль ведет себя точно так же, как и ваше приложение Rails. Если вы защитили некоторые атрибуты для конкретной модели, вы не сможете массово назначать эти атрибуты либо с консоли, либо с самого приложения Rails.

1

Когда вы указываете, что-то должно быть attr_accessible, только эти вещи могут быть доступны в консоли или через интерфейс веб-сайта.

например: Предположим, вы сделали name и email быть attr_accessible:

attr_accessible :name, :email 

и ушел из created_at и updated_at (которые вы должны). Затем вы можете редактировать или обновлять только эти поля в консоли.

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 

веселит.

Смежные вопросы