При использовании Ajax для записи POST я получаю сообщение: ActionController :: ParameterMissing (параметр отсутствует или значение пусто: player_bonuse) - PullRequest
0 голосов
/ 19 декабря 2018

Я прочитал все сообщения, касающиеся аутентификации csrf и публикации записей с использованием ajax, и внес изменения.Хотя проблема «Не удается проверить подлинность токена CSRF» исчезла, я все еще подозреваю, что это может быть проблемой.Я использую Rails 5.1.Я долго работал над этим вопросом и был бы признателен за помощь, пожалуйста.

Эта часть приложения имеет одну HTML-форму с колесом, которое вращается с помощью jquery.Форма получает скрытые данные от контроллера, к которому скрипт jquery обращается из формы.Результирующая позиция вращения обеспечивает оставшиеся данные, которые будут записаны в таблицу PlayerBonuses.Проблема возникает, когда программа пытается отправить этот результат в таблицу.

Внизу включены возвращенные данные и сообщение об ошибке в трех тестах.У данных нет пропущенных столбцов, которые я вижу.

  1. Ajax-скрипт с - data: player_bonuse и dataType: 'json'

  2. Ajax-скрипт с - data: JSON.stringify ({player_bonuse})

  3. Для сравнения, данные возвращаются через обычный ввод бонусных данных через метод restful Rails.

Примечание:

а) Номер 1 больше напоминает результат покоя

б) Номер 2 содержит имя параметра "player_bonuse" (как и результат покоя)

в) Номер 2выделяет результат => nil, который не очевиден в 1.

d) Также не показывают данные CSRF в заголовке, который существует в 3, хотя ошибка аутентификации больше не отображается.

Заранее благодарю за любую помощь / советы, которые вы можете предоставить.

Модель player_bonuse:

 class PlayerBonuse < ApplicationRecord

   belongs_to :user
   belongs_to :bonus_table_reference
   belongs_to :bonus_reference
   belongs_to :award_reference

   validates :user_id, presence: true
   validates :bonus_table_reference_id, presence: true
   validates :bonus_reference_id, presence: true
   validates :award_reference_id, presence: true
   validates :date_awarded, presence: true
   validates :award_amount, presence: true

 end

Метод вращения контроллера:

 def return_daily_spin
     @player_bonuse = PlayerBonuse.new
     @user = User.find(current_user.id)
     @date_awarded = Time.zone.now
 end

Метод создания контроллера:

 def create
   @player_bonuse = PlayerBonuse.new(player_bonuse_params)
   if @player_bonuse.save
      if @player_bonuse.bonus_reference_id = 2
          redirect_to lobby_path(:user_id => current_user.id)
      else
         respond_to do |format|
            format.html { redirect_to @player_bonuse, notice: 'Player bonus was successfully created.' }
            format.json { render :show, status: :created, location: @player_bonuse }
            end
       end
     else
       respond_to do |format|
          format.html { render :new }
          format.json { render json: @player_bonuse.errors, status: :unprocessable_entity }
       end
     end
 end

Параметры таблицы контроллера:

 def player_bonuse_params
  params.require(:player_bonuse).permit(:id, :user_id, :bonus_table_reference_id, :bonus_reference_id, :award_reference_id, :date_awarded, :award_amount, :search)
 end

Метод отправки AJAX:

         $.ajax({
           url:  '/player_bonuse',
           type: 'POST',
           beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
           data: player_bonuse,
          dataType: 'json'
         }).done(function (data) {
         if (data.Success) {
          alert('success!');
         } else {
             alert('failure');
         }           
        });

Обработка результата с помощью приведенного вышекод:

Обработка PlayerBonusesController # создать как JSON Параметры: {"user_id" => "1", "bonus_table_reference_id" => "10", "bonus_reference_id" => "2", "award_reference_id" =>"1", "date_awarded" => "2018-12-19 09:38:06 +1000", "award_amount" => "5000"} Выполнено 400 неверных запросов за 2 мс (ActiveRecord: 0,0 мс)

ActionController :: ParameterMissing (параметр отсутствует или значение пусто: player_bonuse


Результат с использованием кода "data: JSON.stringify ({player_bonuse})" "

ОбработкаPlayerBonusesController # создать как / Параметры: {"{\" player_bonuse \ ": {\" user_id \ ": \" 1 \ ", \" bonus_table_reference_id \ ": 11, \" bonus_reference_id \ ": 2, \" award_reference_id \ ": 1, \" date_awarded \ ": \" 2018-12-19 11:02:41 1000 \ ", \" award_amount \ ":10000}} "=> nil} Выполнено 400 неправильных запросов за 2 мс (ActiveRecord: 0,0 мс)

ActionController :: ParameterMissing (параметр отсутствует или значение пусто: player_bonuse): ________________________________________________________________________________

Результат при добавлении бонуса через Rails Restful Process:

"authenticity_token" => "nkcECEzAYJQvDQ26 / Ij5eslDOzk8umY / c0aexJGCVsWR1F6CYl + 7SH4FgcJhaBS656CRf5t =" 1> "1>" player_1> "player_3_1>" player_3_1 = "player_1_1 =" player_3_1 = "player_3_1 =" player_1_1 = "player_3_1 =" player_3_1 = "player_1_1", "bonus_table_reference_id" => «11», «bonus_reference_id» => «2», «award_reference_id» => «1», «date_awarded (3i)" => «18», «date_awarded (2i)" => «12"," date_awarded (1i) "=>« 2018 »,« award_amount »=>« 10000 »},« commit »=>« Создать »}


Ответы [ 2 ]

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

Я бы не решил это без помощи Бхаргава Редди.Спасибо, Бхаргав.

Предыдущее распределение данных было:

      var player_bonuse = {
            user_id: player_id,
            bonus_table_reference_id: bonus_table_id,
            bonus_reference_id: bonus_ref,
            award_reference_id: award_ref,
            date_awarded:  award_date,
            award_amount:  bonus
       };

Я изменил свой код на:

         var player_bonuse

         $.ajax({
            url:  '/player_bonuse',
            type: 'POST',
            beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
            data: {player_bonuse: {
            bonus_table_reference_id: bonus_table_id,
            bonus_reference_id: bonus_ref,
            award_reference_id: award_ref,
            date_awarded: award_date,
            award_amount: bonus
           }},
           dataType: 'json'
           }).done(function (data) {
           if (data.Success) {
             alert('success!');
           } else {
             alert('failure');
           }           
          });

Мой контроллер не изменился.

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

Не знаю, но однажды попробую вот так

def create
params.permit( :user_id, :bonus_table_reference_id, :bonus_reference_id, :award_reference_id, :date_awarded, :award_amount )
 @player_bonuse = PlayerBonuse.new (:user_id =>params[:user_id], :bonus_table_reference_id => params[:bonus_table_reference_id],:bonus_reference_id => params[:bonus_reference_id],:award_reference_id => params[:award_reference_id], :date_awarded => params[:date_awarded],:award_amount => params[:award_amount])

  if @player_bonuse.save
   if @player_bonuse.bonus_reference_id = 2
      redirect_to lobby_path(:user_id => current_user.id)
   else
     respond_to do |format|
        format.html { redirect_to @player_bonuse, notice: 'Player bonus was successfully created.' }
        format.json { render :show, status: :created, location: @player_bonuse }
        end
   end
 else
   respond_to do |format|
      format.html { render :new }
      format.json { render json: @player_bonuse.errors, status: :unprocessable_entity }
   end
 end
end

Преобразовать параметры в строку, если необходимо, и дать символы столбца базы данных в новом операторе

...