Rails добавляет поля API из ниоткуда - PullRequest
0 голосов
/ 11 июля 2019

Я создаю RESTful API, используя Rails API Mode. Я использую devise для обработки создания пользователя и simple_token_authentication для обработки создания и авторизации токена.

Вот как я делаю запрос на выборку:

  async requestAccountCreation(data) {
    await fetch('http://localhost:3000/users', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: data
    })
      .then(response => response.json())
      .then(data => {
        console.log(data)
      })
      .catch(e => {
        console.log(e)
      })
  }

Когда я console.log() получаю данные requestAccountCreation(data), это дает мне допустимую строку JSON, так что никаких проблем с этим нет. Вот что отправлено на сервер Rails:

{"firstname":"Tristan","lastname":"Vermeesch","username":"PlayBossWar","email":"titivermeesch2@gmail.com","address":"Rue Haute, 37 5550 Chairière","password":"jsoaod"}

Теперь вот часть Rails, первая моя user.rb:

class User < ApplicationRecord
  acts_as_token_authenticatable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  validates :firstname, presence: true
  validates :lastname, presence: true
  validates :username, presence: true
  validates :address, presence: true
  validates :idcard, presence: true
end

Дополнительные поля - это поля, которые я добавил к уже существующим, которые devise сгенерировал для меня, я перенес все файлы.

Это route Я использовал:

devise_for :users, :controllers => { registrations: 'registrations' }

Как видите, я добавил собственный контроллер для обработки дополнительных полей, вот он:

class RegistrationsController < Devise::RegistrationsController
  private

  def sign_up_params
    params.permit(:firstname, :lastname, :email, :password, :username, :idcard, :address)
  end

  def account_update_params
    params.permit(:firstname, :lastname, :email, :password, :current_password, :username, :idcard, :address)
  end
end

Я получил это из поста StackOverflow.

Теперь у меня ошибка в консоли, вот она:

Started POST "/users" for 127.0.0.1 at 2019-07-11 12:24:42 +0200
Processing by RegistrationsController#create as */*
  Parameters: {"firstname"=>"Tristan", "lastname"=>"Vermeesch", "username"=>"PlayBossWar", "email"=>"titivermeesch2@gmail.com", "address"=>"Rue Haute, 37 5550 Chairière", "password"=>"[FILTERED]", "registration"=>{"firstname"=>"Tristan", "lastname"=>"Vermeesch", "username"=>"PlayBossWar", "email"=>"titivermeesch2@gmail.com", "address"=>"Rue Haute, 37 5550 Chairière", "password"=>"[FILTERED]"}}
Unpermitted parameter: :registration
   (0.1ms)  begin transaction
  ↳ /home/tristan/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
  User Exists (0.3ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "titivermeesch2@gmail.com"], ["LIMIT", 1]]
  ↳ /home/tristan/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
   (0.1ms)  rollback transaction
  ↳ /home/tristan/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
Completed 200 OK in 452ms (Views: 0.2ms | ActiveRecord: 5.2ms)

Итак, это говорит о том, что есть недопустимый параметр :registration. Дело в том, что я не знаю, откуда это взялось, я не передаю его в свой интерфейс, так что это должно быть разработано, но я не знаю, почему это происходит.

После отключения оболочки, как предложено, теперь моя ошибка:

Started POST "/users" for 127.0.0.1 at 2019-07-11 13:46:28 +0200
Processing by RegistrationsController#create as */*
  Parameters: {"firstname"=>"Tristan", "lastname"=>"Vermeesch", "username"=>"PlayBossWar", "email"=>"titivermeesch25@gmail.com", "address"=>"Rue Haute, 37 5550 Chairière", "password"=>"[FILTERED]"}
   (0.2ms)  begin transaction
  ↳ /home/tristan/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
  User Exists (0.5ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "titivermeesch25@gmail.com"], ["LIMIT", 1]]
  ↳ /home/tristan/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
   (0.2ms)  rollback transaction
  ↳ /home/tristan/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
Completed 200 OK in 430ms (Views: 0.3ms | ActiveRecord: 10.9ms)

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Вы включили config.wrap_parameters в вашем инициализаторе [проверьте файл config / initializers / wrap_parameters.rb ] или [вы] вызываете wrap_parameters () в вашем контроллере ... параметры будут по умолчанию клонируется и заворачивается в ключ согласно имени вашего контроллера.

Посмотрите здесь: http://guides.rubyonrails.org/action_controller_overview.html#parameters http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html

вызов wrap_parameters false в конкретном контроллере или в контроллере приложения также остановит это поведение на уровне конкретного контроллера и во всем приложении соответственно.

1 голос
/ 11 июля 2019

Чтение содержимого config/initializers/wrap_parameters.rb.

Затем либо отключите перенос (как описано в комментариях к файлу), либо разрешите параметры на уровне ключа, например:

params
  .require(:registration)
  .permit(*%i[firstname lastname email password username idcard address])

Дополнительная информация .

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