使用 Ajax 到 POST 记录时,我收到消息:ActionController::ParameterMissing(缺少参数或值为空:player_bonuse)

While using Ajax to POST record, I receive the message: ActionController::ParameterMissing (param is missing or the value is empty: player_bonuse)

我已阅读所有 post 有关 csrf 身份验证和 posting 使用 ajax 的记录并进行了更改。尽管 "Can't verify CSRF token authenticity" 问题已经解决,但我仍然怀疑这可能仍然是问题所在。我正在使用 Rails 5.1。我在这个问题上工作了很长时间,希望能得到帮助。

应用程序的这一部分有一个单独的 HTML 表单,带有一个使用 jquery 旋转的轮子。表单从控制器接收隐藏数据,jquery 脚本从表单访问这些数据。旋转的结果位置提供了要写入 PlayerBonuses table 的其余数据。当程序试图 post 这个结果到 table.

时会出现问题

最下面是三个测试返回的数据和报错信息。我可以看到,数据没有任何缺失的列。

  1. Ajax 脚本 - 数据:player_bonuse 和数据类型:'json'

  2. 带有-数据的Ajax脚本:JSON.stringify({player_bonuse})

  3. 为了便于比较,通过Railsrestful方法正常输入bonus数据返回的数据。

注:

a) 数字 1 更接近 restful 结果

b) 数字 2 包含参数名称,"player_bonuse"(restful 结果也是如此)

c) 数字 2 分配结果 => nil,这在 1 中并不明显。

d) 不再显示3中存在的header中的CSRF数据,尽管不再显示真实性错误。

提前感谢您提供的任何 help/insights。

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

控制器Table参数:

 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

AJAXPost方法:

         $.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 处理#create as 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"} 在 2 毫秒内完成 400 个错误请求(ActiveRecord:0.0 毫秒)

ActionController::ParameterMissing(参数缺失或值为空:player_bonuse


使用代码的结果"data: JSON.stringify({player_bonuse})"

PlayerBonusesController 处理#create as / 参数:{"{\"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} 在 2 毫秒内完成 400 个错误请求(ActiveRecord:0.0 毫秒)

ActionController::ParameterMissing(参数缺失或值为空:player_bonuse):________________________________________________________________________________

通过Rails Restful 过程添加奖金的结果:

"authenticity_token"=>"nkcECEzAYJQvDQ26/Ij5eslDOzk8umY/c0aexJGCVsWR1F6CYl+7SH4FgcJhaBS656CRf5rl0Ipa3W0tVksCRA==","player_bonuse"=>{"user_id"=>"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"=>"Create"}


我不知道但是试过一次

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

如果需要,将参数转换为字符串,并在新语句中给出数据库列符号

如果没有 Bhargav Reddy 的帮助,我不可能解决这个问题。谢谢巴尔加夫。

之前的数据分配是:

      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');
           }           
          });

我的控制器没有变化。