Как вы используете Rails 5.2 wrap_parameters? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть приложение Rails 5.2, созданное только как API.Я использую Почтальон для проверки конечных точек.В настоящее время я упаковываю все мои сообщения JSON с корневым элементом, чтобы он передавал «сильные параметры».Однако в соответствии с документацией Rails, когда wrap_parameters настроен на прием JSON, мне не нужно этого делать, однако мои POST завершатся неудачно, если я этого не сделаю.Что я делаю не так?


# users_controller.rb

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :update, :destroy]

  .....

  # POST /users
  def create
    @user = User.new(user_params)

    if @user.save
      render json: @user, status: :created, location: @user
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

  .....

  private
  .....

    # Only allow a trusted parameter "white list" through.
    def user_params
      params.require(:user).permit(:email, :password, :is_admin, :is_agent)
    end
end

# config/initializers/wrap_parameters.rb

ActiveSupport.on_load(:action_controller) do
  wrap_parameters format: [:json]
end

enter image description here

Если я заверну JSON в user это работает просто отлично, однако, согласно документации Rails, мне не нужно было этого делать.

http://api.rubyonrails.org/v5.2.0/classes/ActionController/ParamsWrapper.html

Я попытался добавить wrap_parameters User и wrap_parameters :userи wrap_parameters format: [:json] прямо на users_controller.rb, но это ничего не делает.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я понял это.Мне пришлось добавить wrap_parameters :user, include: %i[email password is_admin is_agent] в контроллер Users следующим образом:

# users_controller.rb

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :update, :destroy]

  wrap_parameters :user, include: %i[email password is_admin is_agent]

  .....

  # POST /users
  def create
    @user = User.new(user_params)

    if @user.save
      render json: @user, status: :created, location: @user
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

  .....

  private
  .....

    # Only allow a trusted parameter "white list" through.
    def user_params
      params.require(:user).permit(:email, :password, :is_admin, :is_agent)
    end
end

Я до сих пор не до конца понимаю, почему, но это работает.Документы подразумевают, что это должно происходить автоматически через модуль параметров переноса.

0 голосов
/ 01 июня 2018

Это из-за белого списка параметров .

 def user_params
   params.require(:user).permit(:email, :password, :is_admin, :is_agent)
 end

Здесь требуется ключ пользователя.С точки зрения безопасности, это хорошая возможность в RoR для внесения в белый список параметров

Если вы пишете только params.permit(:email, :password, :is_admin, :is_agent), то ваш запрос будет работать, но удаление объекта пользователя не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...