У Розділі 4.4.5 ми коротко згадали про ідею масового призначення, яка має на увазі ініціалізацію Ruby-змінної з хешем значень:
Для вирішення цієї проблеми попередні версії Rails використовували метод attr_accessible на рівні моделі, але в Rails 4.0 більш кращою є техніка з використанням так званих строгих параметрів на рівні контролера. Це позваляет нам прописати які саме параметри є обов'язковими, а які дозволеними. До того ж, передача чистого хеша params (як це було показано вище) призведе до помилки, тобто тепер Rails додатки несприйнятливі до уязвимостям масового назначінія за замовчуванням.
В даному випадку ми хочемо вимагати від хеша params наявність атрибута: user і ми хочемо дозволити наявність атрибутів name, email, password і password_confirmation (але тільки їх). Ми можемо досягти цього в такий спосіб:
Цей код поверне версію хеша params містить тільки дозволені атрибути (при цьому буде викликана помилка якщо відсутня атрибут: user).
Для полегшення використання цих параметрів, зазвичай вводять допоміжний метод з назвою user_params який повертає відповідний ініціалізацій хеш використовується замість params [: user]:
Оскільки user_params буде використовуватися тільки усередині контролера Users і немає ніякої потреби відкривати до нього доступ зовнішнім користувачам через веб, ми зробимо його приватним використовуючи ключове слово private, як це показано в лістингу 7.22. (Ми більш детально обговоримо private в Розділі 8.2.1.)
Лістинг 7.22. Використання строгих параметрів в дії create. app / controllers / users_controller.rb
З кодом з лістингу 7.22 тести відправки невалидность даних повинні пройти:
Повідомлення про помилки при реєстрації
Тут об'єкт errors.full_messages (який ми бачили коротко в Розділі 6.2.2) містить масив повідомлень про помилки.
Як і в консольної сесії вище, збій збереження в лістингу 7.21 генерує список повідомлень про помилки, пов'язаних з об'єктом @user. Для відображення повідомлення в браузері, ми Рендер партіал error_messages на сторінці user new як це показано в лістингу 7.23. (Написання тесту на повідомлення про помилки це хороша ідея і ми залишимо ці тести як вправа; див. Розділ 7.6.) Варто зазначити що цей партіал повідомлень про помилки лише перша спроба; кінцева версія представлена в Розділі 10.3.2.
Лістинг 7.23. Код для відображення повідомлень про помилки в формі реєстрації. app / views / users / new.html.erb
Зауважимо тут, що ми render партіал 'shared / error_messages'; що відображає загальну конвенцію Rails, яка наказує розміщення часткових шаблонів які ми плануємо використовувати в багатьох контролерах в спеціально відведеному каталозі shared /. Це означає, що ми повинні створити цей новий каталог разом з файлом партіала _error_messages.html.erb. Сам партіал представлений в лістингу 7.24.
Лістинг 7.24. Партіал для відображення повідомлень про помилки відправки форми реєстрації. app / views / shared / _error_messages.html.erb
Цей частковий шаблон вводить кілька нових Rails і Ruby конструкцій, в тому числі два методи для об'єкта помилок Rails. Перший метод це count, який просто повертає кількість помилок:
Інший новий метод це any. який (разом з empty?) є одним з пари взаємодоповнюючих методів:
Ми бачимо тут що метод empty. який ми вперше побачили в Розділі 4.2.3 в контексті рядків, також працює на об'єкті помилок Rails, возваращая true для порожнього об'єкта і false в іншому випадку. Метод any? це просто протилежність empty. повертає true якщо існує який-небудь елемент і false в іншому випадку. (До речі, всі ці методи - count. Empty? І any? - працюють і на масивах Ruby. Ми знайдемо хороше застосування цим фактом в Розділі 10.2.)
Інший новою ідеєю є текстовий хелпер pluralize. За замовчуванням, він недоступний в консолі, але ми можемо явно його включити через модуль ActionView :: Helpers :: TextHelper. 9 Я з'ясував це шляхом пошуку pluralize в Rails API
Ми бачимо тут, що pluralize приймає цілочисельний аргумент і повертає число з правильною версією множини його другого аргументу. В основі цього методу лежить потужний інфлектор, який знає як перетворити у множину величезна кількість слів (в тому числі, багато з неправильним множиною):
В результаті код