В Rails какая разница между attr_accessor
и attr_accessible
? Насколько я понимаю, использование attr_accessor
используется для создания методов получения и установки для этой переменной, так что мы можем получить доступ к переменной как Object.variable
или Object.variable = some_value
.
Я читал, что attr_accessible
делает эту конкретную переменную доступной для внешнего мира. Может кто-нибудь, пожалуйста, скажите мне, в чем разница
ruby-on-rails
ruby
Феликс
источник
источник
attr_accessor
используется для генерации методов получения и установки. Пожалуйста, смотрите мой ответ на предыдущий вопрос для довольно подробного объясненияattr_accessible
: stackoverflow.com/questions/2652907/… затем обновите свой вопрос, если вам понадобятся какие-либо другие конкретные детали после этого.Ответы:
attr_accessor
это метод Ruby, который делает геттер и сеттер.attr_accessible
это метод Rails, который позволяет передавать значения в массовое присваивание:new(attrs)
илиupdate_attributes(attrs)
.Вот массовое задание:
Вы можете себе представить, что заказ может также иметь код скидки, скажем
:price_off
. Если вы не помечаете теги:price_off
какattr_accessible
препятствующие выполнению вредоносного кода, сделайте так:Даже если ваша форма не имеет поля для
:price_off
, если она есть в вашей модели, она доступна по умолчанию. Это означает, что созданный POST все еще может установить его. Использованиеattr_accessible
белых списков тех вещей, которые могут быть массово назначены.источник
attr_accessible
в документации по Rails? api.rubyonrails.orgattr_accessible
edgeguides.rubyonrails.org/…Многие пользователи в этой теме и в Google очень хорошо объясняют, что
attr_accessible
указывает белый список атрибутов, которые разрешено обновлять массово ( все атрибуты объектной модели одновременно ). Это главным образом (и только) для защиты вашего приложения. из "Массового задания" пиратский подвиг.Это объясняется здесь на официальном Rails doc: Mass Assignment
attr_accessor
код ruby для быстрого создания методов установки и получения в классе. Вот и все.Теперь в качестве объяснения не хватает того, что когда вы каким-либо образом создаете связь между моделью (Rails) с таблицей базы данных, вам НИКОГДА, НИКОГДА, НИКОГДА не нужно
attr_accessor
в вашей модели создавать сеттеры и геттеры, чтобы иметь возможность изменять ваши записи таблицы.Это связано с тем, что ваша модель наследует все методы
ActiveRecord::Base
класса, который уже определяет для вас основные средства доступа CRUD (Create, Read, Update, Delete). Это объясняется в официальном документе здесь Rails Model и здесь Overwriting accessor по умолчанию (прокрутите вниз до главы «Перезаписать accessor по умолчанию»)Скажем, например, что: у нас есть таблица базы данных с именем «users», которая содержит три столбца «firstname», «lastname» и «role»:
Инструкции SQL:
Я предположил, что вы установили опцию
config.active_record.whitelist_attributes = true
в вашем config / environment / production.rb для защиты вашего приложения от эксплойта с массовыми назначениями. Это объясняется здесь: массовое назначениеВаша модель Rails будет отлично работать с моделью ниже:
Однако вам нужно обновить каждый атрибут пользователя отдельно в вашем контроллере, чтобы представление вашей формы работало:
Теперь, чтобы облегчить вашу жизнь, вы не хотите делать сложный контроллер для вашей модели User. Таким образом, вы будете использовать
attr_accessible
специальный метод в вашей модели класса:Таким образом, вы можете использовать «шоссе» (массовое назначение) для обновления:
Вы не добавили атрибуты "role" в
attr_accessible
список, потому что вы не позволяете своим пользователям самим устанавливать свою роль (например, admin). Вы делаете это самостоятельно на другом специальном админском View.Хотя ваше представление пользователя не отображает поле «роль», пират может легко отправить HTTP-запрос POST, включающий «роль» в хэш params. Отсутствующий атрибут "role" в файле
attr_accessible
предназначен для защиты вашего приложения от этого.Вы по-прежнему можете изменять свой атрибут user.role самостоятельно, как показано ниже, но не со всеми атрибутами вместе.
Какого черта вы бы использовали
attr_accessor
?Ну, это было бы в случае, если ваша пользовательская форма показывает поле, которое не существует в вашей таблице пользователей в виде столбца.
Например, скажем, в вашем пользовательском представлении отображается поле «пожалуйста, скажите администратору, что я здесь». Вы не хотите хранить эту информацию в вашей таблице. Вы просто хотите, чтобы Rails отправил вам электронное письмо с предупреждением о том, что один "сумасшедший" ;-) пользователь подписался.
Чтобы иметь возможность использовать эту информацию, вам нужно временно где-то ее хранить. Что проще, чем восстановить его в
user.peekaboo
атрибуте?Таким образом, вы добавляете это поле к вашей модели:
Таким образом, вы сможете грамотно использовать
user.peekaboo
атрибут где-то на вашем контроллере, чтобы отправлять электронную почту или делать все, что захотите.ActiveRecord не сохранит атрибут «peekaboo» в вашей таблице, когда вы это сделаете,
user.save
потому что она не видит ни одного столбца, соответствующего этому имени, в ее модели.источник
attr_accessor
это метод Ruby, который дает вам методы setter и getter для переменной экземпляра с тем же именем. Так что это эквивалентноattr_accessible
является методом Rails, который определяет, какие переменные могут быть установлены в массовом присваивании.Когда вы отправляете форму, и у вас есть что-то вроде
MyModel.new params[:my_model]
этого, вы хотите иметь немного больше контроля, чтобы люди не могли отправлять вещи, которые вы не хотите, чтобы они.Вы можете сделать
attr_accessible :email
так, чтобы, когда кто-то обновлял свою учетную запись, он мог изменить свой адрес электронной почты. Но вы бы этого не сделали,attr_accessible :email, :salary
потому что тогда человек мог установить свою зарплату путем подачи формы. Другими словами, они могли взломать свой путь к рейзу.Такого рода информация должна быть явно обработана. Просто удалить его из формы недостаточно. Кто-то может пойти с firebug и добавить элемент в форму, чтобы отправить поле зарплаты. Они могут использовать встроенный curl для отправки нового оклада в метод обновления контроллера, они могут создать скрипт, который отправляет сообщение с этой информацией.
Речь
attr_accessor
идет о создании методов для хранения переменных иattr_accessible
о безопасности массовых назначений.источник
attr_accesible
:as
!class User < ActiveRecord::Base
attr_accessor
является рубиновым кодом и используется, когда у вас нет столбца в базе данных, но вы все еще хотите показать поле в ваших формах. Единственный способ разрешить это -attr_accessor :fieldname
и вы можете использовать это поле в своем представлении или модели, если хотите, но в основном в своем представлении.Давайте рассмотрим следующий пример
Здесь мы использовали
attr_reader
( читаемый атрибут ) иattr_writer
( доступный для записи атрибут ) для доступа к цели. Но мы можем достичь той же функциональности, используяattr_accessor
. Вкратце, attr_accessor предоставляет доступ как к методам получения, так и к методам установки.Таким образом, модифицированный код, как показано ниже
attr_accessible
позволяет вам перечислить все столбцы, которые вы хотите разрешить массовое назначение. Противоположность этомуattr_protected
означает, что в этом поле я НЕ хочу, чтобы кому-либо было разрешено массовое назначение. Скорее всего, это будет поле в вашей базе данных, с которым вы не хотите, чтобы кто-то возился. Как поле состояния или тому подобное.источник
В двух словах:
attr_accessor
этоgetter
,setter
метод. тогда какattr_accessible
сказать, что определенный атрибут доступен или нет. Это оно.Я хочу добавить, что мы должны использовать параметр Strong вместо того,
attr_accessible
чтобы защищать от массового присвоения.Ура!
источник
Быстрый и краткий обзор различий:
источник