Ruby on Rails: я не могу создать нового пользователя - PullRequest
0 голосов
/ 11 декабря 2018

Когда я отправил на терминал с $ curl -X POST '{"user": {"name": "hogehoge", "email": "hogehoge@gmail.com", "icon_url": "hogehoge", "location": "hogehgoe", "password": "hogehoge"}}' localhost:3000/v1/users в каталоге приложения для создания нового пользователя, у меня произошла ошибка.

{
  "status": 400,
  "error": "Bad Request",
  "exception": "#<ActionController::ParameterMissing: param is missing or the value is empty: user>",
  ・・・
  ・・・
  ・・・
}

в журнале сервера

Started POST "/v1/users" for 127.0.0.1 at 2018-12-11 16:55:56 +0900
Processing by V1::UsersController#create as JSON
  Parameters: {"name"=>"hogehoge", "email"=>"hogehoge@gmail.com", "icon_url"=>"hogehoge", "location"=>"hogehoge", "password"=>"[FILTERED]"}
Completed 400 Bad Request in 1ms



ActionController::ParameterMissing (param is missing or the value is empty: user):

app/controllers/v1/users_controller.rb:52:in `user_params'
app/controllers/v1/users_controller.rb:20:in `create'

Я думал, что user_params был удовлетворен правильными параметрами, но это не так.

Это мой user_controller.rb

module V1
  class UsersController < ApiController
    before_action :set_user, only: [:show, :update, :destroy]
    skip_before_action :authenticate_user_from_token!, only: [:show, :index, :create]



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

      if @user.save
        render json: @user, serializer: V1::UserSerializer
      else
        render json: @user.errors, status: :unprocessable_entity
      end
    end


    private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

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

, почему HTTP отправил мне 400 неверных кодов состояния?


Как вы сказали, я отправил на терминал с этими параметрами JSON значение localhost:3000/v1/users.

{
 "user": 
    {
    "name": "hogehoge",
    "email": "hogehoge@gmail.com",
    "icon_url": "hogehoge",
    "location": "hogehoge",
    "password": "hogehoge"
    }
}   

, но теперь статус HTTP отправил мне 500 внутренних ошибок сервера.Это новый код ошибки.

Started POST "/v1/users" for 127.0.0.1 at 2018-12-11 17:33:50 +0900
Processing by V1::UsersController#create as JSON
  Parameters: {"user"=>{"name"=>"hogehoge", "email"=>"hogehoge@gmail.com", "icon_url"=>"hogehoge", "location"=>"hogehoge", "password"=>"[FILTERED]"}}
<ActionController::Parameters {"user"=><ActionController::Parameters {"name"=>"hogehoge", "email"=>"hogehoge@gmail.com", "icon_url"=>"hogehoge", "location"=>"hogehoge", "password"=>"hogehoge"} permitted: false>, "format"=>:json, "controller"=>"v1/users", "action"=>"create"} permitted: false>
Completed 500 Internal Server Error in 34ms (ActiveRecord: 2.0ms)



ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):

app/controllers/v1/users_controller.rb:20:in `create'

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Похоже, вы оставили отладочный код в #user_params, поэтому он не вернет нужный объект:

# Only allow a trusted parameter "white list" through.
def user_params
  params.require(:user).permit(:name, :email, :location, :icon_url, :password)
  p params
end
0 голосов
/ 11 декабря 2018

Ваше мнение

Вы не передаете хеш с ключом user в своих параметрах,

  Parameters: {"name"=>"hogehoge", "email"=>"hogehoge@gmail.com", "icon_url"=>"hogehoge", "location"=>"hogehoge", "password"=>"[FILTERED]"}

Если вы создаете пользователя по форме с помощью form_for , это будет выглядеть так:

  Parameters: { "user" => { "name"=>"hogehoge", "email"=>"hogehoge@gmail.com", "icon_url"=>"hogehoge", "location"=>"hogehoge", "password"=>"[FILTERED]" } }

Вы передаете пользовательские параметры по входному тегу наверняка.Итак, как вы должны использовать сильные параметры!

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