Решение, к которому я пришел (спасибо @max за некоторые советы и подсказки) заключается в следующем:
- Добавьте следующую строку в
config/application.rb
:
config.action_controller.action_on_unpermitted_parameters = :raise
Добавьте
rescue_from
либо к
AplicationController
, либо к тому, который вас точно интересует:
class ApplicationController < ActionController::API
include ActionController::MimeResponds
include Pundit
rescue_from Pundit::NotAuthorizedError, ActionController::UnpermittedParameters, with: :user_not_authorized
...
private
def user_not_authorized
render jsonapi: errors_response, status: :unathorized
end
def errors_response
{
errors:
[
{ message: 'You are not authorized to perform this action.' }
]
}
end
end
Затем добавьте метод pundit_params_for
к PostsController
и измените update
действие (в моем случае я хотел бы ограничить некоторые атрибуты только в update
действие :)
class PostsController < ApplicationController
...
def update
if @post.update(permitted_attributes(@post))
render jsonapi: @post
else
render jsonapi: @post.errors, status: :unprocessable_entity
end
end
private
def post_params
ActiveModelSerializers::Deserialization.jsonapi_parse!(
params,
only: [:title, :body, :user]
)
end
def pundit_params_for(_record)
params.fetch(:data, {}).fetch(:attributes, {})
end
end
Вуаля. Теперь, если для действия update
будет представлен недопустимый атрибут, ответ будет иметь статус 500
и содержать ошибку, указанную в ApplicationController#errors_response method
.
Надеюсь, это поможет.