Как использовать 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
Комментариев нет:
Отправить комментарий