attr_accessible в рельсах Active Record

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

5 ответов

Решение

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

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

Я нашел почему:

Определяет белый список атрибутов модели, которые могут быть установлены посредством массового назначения, например 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`.

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

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

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

attr_accessible :name, :email

и опущены created_at а также updated_at (что вы должны) Тогда вы можете редактировать / обновлять только эти поля в консоли.

Если вы хотите выставить поле из вашей модели, вы можете использовать

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

или если вы хотите добавить некоторое поведение к вашему атрибуту, вам придется использовать виртуальные атрибуты

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

веселит.

Другие вопросы по тегам