Различие между attr_accessor и attr_accessible

В направляющих, между чем различие attr_accessor и attr_accessible? От моего понимания, использования attr_accessor используется для создания методов получателя и методов установщика для той переменной, так, чтобы мы могли получить доступ к переменной как Object.variable или Object.variable = some_value.

Я считал это attr_accessible делает ту определенную переменную доступной для внешнего мира. Может кто-то говорить мне, что является различием

235
задан Jordan Running 15 December 2014 в 10:47
поделиться

2 ответа

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

256
ответ дан 23 November 2019 в 03:27
поделиться

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 касается безопасности массовых назначений.

48
ответ дан 23 November 2019 в 03:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: