В направляющих, между чем различие attr_accessor
и attr_accessible
? От моего понимания, использования attr_accessor
используется для создания методов получателя и методов установщика для той переменной, так, чтобы мы могли получить доступ к переменной как Object.variable
или Object.variable = some_value
.
Я считал это attr_accessible
делает ту определенную переменную доступной для внешнего мира. Может кто-то говорить мне, что является различием
attr_accessor
- это метод Ruby, который делает геттер и сеттер. attr_accessible
- это метод Rails, который позволяет передавать значения в массовое присвоение: new(attrs)
or update_attributes(attrs)
.
Вот массовое назначение:
Order.new({ :type => 'Corn', :quantity => 6 })
Вы можете представить, что заказ может также иметь код скидки, скажем :price_off
. Если вы не пометите :price_off
как attr_accessible
, вы лишите вредоносный код возможности сделать вот так:
Order.new({ :type => 'Corn', :quantity => 6, :price_off => 30 })
Даже если в вашей форме нет поля для :price_off
, если оно есть в вашей модели, оно доступно по умолчанию. Это означает, что подделанный POST все равно может его установить. Использование attr_accessible
выводит из белого списка те вещи, которые могут быть массово назначены.
attr_accessor
- это метод Ruby, который предоставляет вам методы установки и получения для переменной экземпляра с тем же именем. Таким образом, это эквивалентно
class MyModel
def my_variable
@my_variable
end
def my_variable=(value)
@my_variable = value
end
end
attr_accessible
- это метод Rails, который определяет, какие переменные могут быть установлены при массовом назначении.
Когда вы отправляете форму и у вас есть что-то вроде MyModel.new params [: my_model]
, тогда вам нужно немного больше контроля, чтобы люди не могли отправлять то, что вы делаете Я не хочу, чтобы они этого делали.
Вы можете использовать attr_accessible: email
, чтобы, когда кто-то обновляет свою учетную запись, он мог изменить свой адрес электронной почты. Но вы бы не стали делать attr_accessible: email,: salary
, потому что тогда человек мог бы установить свою зарплату через отправку формы. Другими словами, они могли взломать свой путь к повышению.
Такого рода информацию необходимо обрабатывать явным образом. Недостаточно просто удалить его из формы. Кто-то может зайти с firebug и добавить элемент в форму для отправки поля зарплаты. Они могут использовать встроенный curl для отправки новой зарплаты методу обновления контроллера, они могут создать скрипт, который отправляет сообщение с этой информацией.
Итак, attr_accessor
предназначен для создания методов для хранения переменных, а attr_accessible
касается безопасности массовых назначений.