Страницы

Поиск по вопросам

понедельник, 17 июня 2019 г.

Как использовать attr_accessible в Rails 5?

Как использовать attr_accessible (может есть аналог) в Rails 5? Гем protected_attributes не работает, так как есть конфликт с версиями activemodel и activerecord. Заранее спасибо.


Ответ

Данный атрибут не работает в современных версиях фреймворка Ruby on Rails. Ранее он использовался для того, чтобы на уроне модели явно задать атрибуты, которые можно будет "массово" редактировать на уровне контроллера (т.е. в группе параметров, которые поступают из формы). Данная практика признана неудачной, во-первых вы неявно разрешаете возможность редактирования для всех контроллеров, которых может быть много (как минимум приложение и система администрирования), во-вторых вы на уровне модели явно выдаете разрешения, которые должны выдаваться в уровне контроллера. В третьих слишком вольное использование этого атрибута (и для backend и для frontend частей приложения) приводило к уязвимостям приложений, когда с frontend-части можно было путем манипуляций содержимым POST-содержимого менять те параметры модели, которые не разрешено менять с frontend-части, но которые были разрешены в attr_accessible например для backend-части сайта.
Начиная с версии Ruby on Rails 4, для разрешение присвоения параметров текущей модели было перемещено с уровня моделей на уровень контроллера. Теперь вам нужно явно указать какие параметры разрешено изменять в модели на уровне контроллера. Например, один из возможных вариантов может выглядеть так
class SomeController < Admin::ApplicationController ... def create resource = Resourse.new resource.assign_attributes(resoure_params) if resource.save redirect_to index_page else render resource.new_record? ? :new : :edit end end ... private
def resourse_params [ :id, :name, :weight ] end ... end
или можно явно пройтись по параметрам, отметить при помощи метода permit те, которые можно передавать модели и воспользоваться например методом create
class SomeController < Admin::ApplicationController ... def create if Resourse.create resource_params redirect_to index_page else render resource.new_record? ? :new : :edit end end ... private
def resource_params params.require(:resource).permit(:id, :name, :weight) end ... end

Комментариев нет:

Отправить комментарий