В этом разделе раздела Pundit говорится, что мы можем контролировать, какие атрибуты разрешено обновлять. Но это не работает в случае использования active_model_seriallizers
gem:
def post_params
# originally geneated by scaffold
#params.require(:post).permit(:title, :body, :user_id)
#To deserialize with active_model_serializers
ActiveModelSerializers::Deserialization.jsonapi_parse!(
params,
only: [:title, :body, :user]
)
end
Если я изменю действие PostsController
update
, как предложил Pundit:
def update
if @post.update(permitted_attributes(@post))
render jsonapi: @post
else
render jsonapi: @post.errors, status: :unprocessable_entity
end
end
не получается с ошибкой:
ActionController::ParameterMissing (param is missing or the value is empty: post):
app/controllers/posts_controller.rb:29:in `update'
Я также создаю PostPolicy
следующим образом:
class PostPolicy < ApplicationPolicy
def permitted_attributes
if user.admin? || user.national?
[:title, :body]
else
[:body]
end
end
end
но это не влияет на вышеуказанную ошибку.
Любая идея о том, как мы можем это сделать?
ActionController::ParameterMissing
вызываетсяActionController::Parameters.html#require
, поэтому вы можете искать у неправильного преступника. - person max   schedule 27.10.2019pundit_params_for
кPostsController
следующим образом:def pundit_params_for(_record) params.fetch(:data, {}).fetch(:attributes, {}) end
и изменил действиеupdate
следующим образом:def update if @post.update(permitted_attributes(@post)) render jsonapi: @post else render jsonapi: @post.errors, status: :unprocessable_entity end end
. Теперь, если пользователь не авторизован для обновленияtitle
, я вижу в консоли:Unpermitted parameter: :title
. - person belgoros   schedule 27.10.2019require(:data).require(:attributes)
вместо выборки. Вы хотите уйти пораньше здесь, так как нет смысла продолжать, если входные данные не соответствуют спецификации. - person max   schedule 27.10.2019fail early
вместоbail early
? - person belgoros   schedule 27.10.2019ActionController::Parameters.action_on_unpermitted_parameters = :raise
где-то вapplication.rb
. Затем спасите его вapplication_controller.rb
нестандартным способом, чтобы отправить обратно с ответом JSON. - person belgoros   schedule 27.10.2019rescue_from
. - person max   schedule 27.10.2019