Недопустимые параметры с simple_token_authentication - PullRequest
0 голосов
/ 11 июля 2019

Итак, у меня есть участник model, созданный в Rails API Mode.

Вот как выглядит контроллер этого элемента:

class ParticipantsController < ApplicationController
    acts_as_token_authentication_handler_for User

    def create
        binding.pry
        participant = Participant.new(participant_params)
        puts "INFO: ----------------------------"
        puts participant.inspect
        puts params
        if(participant.save)
            render json: {
                status: 'SUCCESS',
                message: 'Participant link created',
                data: participant
            }, status: :created
        else 
            render json: {
                status: 'ERROR',
                message: 'Participant link not created',
                data: participant.errors
            }, status: :unprocessable_entity
        end
    end

    private def participant_params
        params.permit(:id_request, :user_id)
    end
end

Вот модель User:

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

Во второй строке вы увидите это: acts_as_token_authentication_handler_for User

Это позволяет мне добавлять аутентификационные заголовки в мой запрос на выборку в React.

Этокак я получаю это:

participateToContribution = id_request => {
    const data = {
      id_request: id_request,
      user_id: localStorage.getItem('email')
    }
    console.log(data)

    fetch('http://localhost:3000/participants', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-User-Email': localStorage.getItem('email'),
        'X-User-Token': localStorage.getItem('token')
      },
      data: data
    })
  }

Я сделал это с другими контроллерами, и это работает хорошо, но теперь по некоторым причинам, когда я выбираю эти рельсы, я получаю эту ошибку:

Started POST "/participants" for 127.0.0.1 at 2019-07-11 19:08:36 +0200
Processing by ParticipantsController#create as */*
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = ? ORDER BY "users"."id" ASC LIMIT ?  [["email", "titivermeesch@gmail.com"], ["LIMIT", 1]]
  ↳ /home/tristan/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
Unpermitted parameters: :user_email, :user_token
   (0.2ms)  begin transaction
  ↳ app/controllers/participants_controller.rb:7
   (0.2ms)  rollback transaction
  ↳ app/controllers/participants_controller.rb:7
Completed 422 Unprocessable Entity in 11ms (Views: 0.4ms | ActiveRecord: 0.7ms)

Я попытался добавить эти 2 поля в .permit(), но это дает мне еще одну ошибку (у меня не было ничего этого в моих других контроллерах, и это просто копия вставлена).

Started POST "/participants" for 127.0.0.1 at 2019-07-11 19:13:15 +0200
   (0.5ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
  ↳ /home/tristan/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
Processing by ParticipantsController#create as */*
  User Load (0.6ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = ? ORDER BY "users"."id" ASC LIMIT ?  [["email", "titivermeesch@gmail.com"], ["LIMIT", 1]]
  ↳ /home/tristan/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
Completed 500 Internal Server Error in 56ms (ActiveRecord: 3.3ms)



ActiveModel::UnknownAttributeError (unknown attribute 'user_email' for Participant.):

app/controllers/participants_controller.rb:5:in `create'

Этоэто то, что отправляется на этот контроллер из интерфейсной части:

{id_request: 1, user_id: "titivermeesch@gmail.com"}

Код GitHub: https://github.com/titivermeesch/neighbourhood-app

pry вывод:

     4: def create
 =>  5:     binding.pry
     6:     participant = Participant.new(participant_params)
     7:     puts "INFO: ----------------------------"
     8:     puts participant.inspect
     9:     puts params
    10:     if(participant.save)
    11:         render json: {
    12:             status: 'SUCCESS',
    13:             message: 'Participant link created',
    14:             data: participant
    15:         }, status: :created
    16:     else
    17:         render json: {
    18:             status: 'ERROR',
    19:             message: 'Participant link not created',
    20:             data: participant.errors
    21:         }, status: :unprocessable_entity
    22:     end
    23: end

Ответы [ 3 ]

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

Обновление fetch с

fetch('http://localhost:3000/participants', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-User-Email': localStorage.getItem('email'),
    'X-User-Token': localStorage.getItem('token')
  },
  body: JSON.stringify({data)
})

}

и данные с

const data = {
     participant: {

      id_request: id_request,
      user_id: localStorage.getItem('email')
    }
}

и participant_params как

def participants_params
  params.require(:participant).permit(:id_request, :user_id)
end
0 голосов
/ 11 июля 2019

Вы не разрешаете их здесь

private

def participants_params
    params.permit(:id_request, :user_id)
end

Вы должны добавить их в этот массив, как этот

private

def participants_params
    params.permit(:id_request, :user_id, :user_email, :user_token)
end

Теперь вы сказали, что это выдало ошибку, потому что user_email не является полем для участника. Вам нужно будет добавить его, чтобы сохранить в нем значение, в противном случае вам нужно будет извлечь его из отправляемого массива параметров, а затем объект сохранится. Вы не можете отправлять недопустимые параметры и пытаться сохранить их, они просто не будут работать.

Единственное другое решение - переписать метод create, но на самом деле это не решение.

def create
  participant = Participant.new
  participant.request_id = params[:participant][:id_request]
  participant.user_id = params[:participant][:user_id]
  if(participant.save)

  ...
0 голосов
/ 11 июля 2019

В этом случае вы должны добавить эти поля (адрес электронной почты и токен) в свой класс User.Здесь у нас есть полный пример для https://gist.github.com/bosskovic/816623404b60b30726a8

Если у вас уже есть эти поля, вам просто нужно правильно сопоставить user_email param с email столбцом.

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