Багато людей у цій нитці та в google дуже добре пояснюють, що attr_accessible
вказується білий список атрибутів, які дозволено оновлювати масово ( усі атрибути об'єктної моделі разом разом ) Це головним чином (і лише) для захисту вашої програми від піратського подвигу "Масове призначення".
Це пояснюється тут на офіційному документі Rails: Mass Assignment
attr_accessor
це рубіновий код для (швидкого) створення методів встановлення та отримання в Класі. Це все.
Тепер, чого не вистачає як пояснення, є те, що коли ви створюєте якимось чином зв’язок моделі (Rails) з таблицею баз даних, вам НІКОЛИ, НІКОЛИ, НІКОЛИ не потрібно attr_accessor
у вашій моделі створювати сеттери та геттери, щоб мати змогу змінювати свої записи таблиці.
Це тому, що ваша модель успадковує всі методи від ActiveRecord::Base
класу, який вже визначає базові CRUD-аксесуари (Створення, читання, оновлення, видалення) для вас. Це пояснюється в офіційному документі тут Rails Model і тут Перезапис аксесуара за замовчуванням (прокрутіть униз до розділу "Перезапис аксесуара за замовчуванням")
Скажімо, наприклад, що у нас є таблиця бази даних під назвою "користувачі", яка містить три стовпці "ім'я", "прізвище" та "роль":
Інструкції SQL:
CREATE TABLE users (
firstname string,
lastname string
role string
);
Я припускав, що ви встановите параметр config.active_record.whitelist_attributes = true
у своєму config / environment / production.rb, щоб захистити свою програму від використання масового призначення. Це пояснюється тут: масове призначення
Ваша модель Rails буде ідеально працювати з Модель тут:
class User < ActiveRecord::Base
end
Однак вам потрібно буде оновити кожен атрибут користувача окремо у своєму контролері, щоб перегляд форми працював:
def update
@user = User.find_by_id(params[:id])
@user.firstname = params[:user][:firstname]
@user.lastname = params[:user][:lastname]
if @user.save
# Use of I18 internationalization t method for the flash message
flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human)
end
respond_with(@user)
end
Тепер, щоб полегшити ваше життя, ви не хочете робити складний контролер для вашої моделі користувача. Отже, ви будете використовувати attr_accessible
спеціальний метод у вашій моделі Class:
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
end
Таким чином, ви можете використовувати "шосе" (масове призначення) для оновлення:
def update
@user = User.find_by_id(params[:id])
if @user.update_attributes(params[:user])
# Use of I18 internationlization t method for the flash message
flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human)
end
respond_with(@user)
end
Ви не додавали до attr_accessible
списку атрибути "роль", оскільки ви не дозволяєте вашим користувачам самостійно встановлювати свою роль (наприклад, адміністратор). Ви робите це самостійно в іншому спеціальному перегляді адміністратора.
Хоча у вашому представництві користувача не відображається поле "роль", пірат може легко надіслати HTTP POST-запит, який включає "роль" у хеш-парамах. Відсутній атрибут "роль" у програмі attr_accessible
- захист вашої програми від цього.
Ви все одно можете змінювати свій атрибут user.role, як нижче, але не з усіма атрибутами разом.
@user.role = DEFAULT_ROLE
Чому, чортве, ти б використовував attr_accessor
?
Ну, це було б у випадку, якщо у вашій формі користувача відображається поле, яке не існує в таблиці користувачів як стовпець.
Наприклад, скажімо, що у вашому перегляді користувача відображається поле "будь-ласка, скажи-адміністратор-що-я тут". Ви не хочете зберігати цю інформацію у своїй таблиці. Ви просто хочете, щоб Rails надсилав вам електронний лист із попередженням про те, що один "божевільний" ;-) користувач підписався.
Щоб користуватися цією інформацією, її потрібно тимчасово зберігати десь. Що простіше, ніж відновити його в user.peekaboo
атрибуті?
Отже, ви додаєте це поле до своєї моделі:
class User < ActiveRecord::Base
attr_accessible :firstname, :lastname
attr_accessor :peekaboo
end
Таким чином, ви зможете навчитись використовувати user.peekaboo
атрибут десь у контролері, щоб надіслати електронну пошту чи робити все, що завгодно.
ActiveRecord не збереже атрибут "peekaboo" у вашій таблиці, коли ви це зробите, user.save
оскільки в своїй моделі вона не бачить жодного стовпця, що відповідає цьому імені.
attr_accessor
використовується для створення методів геттера та сетера. Будь ласка, дивіться мою відповідь на попереднє запитання щодо досить вичерпного поясненняattr_accessible
: stackoverflow.com/questions/2652907/…, а потім оновіть своє запитання, якщо вам потрібні інші конкретні деталі після цього.