【问题标题】:While using Ajax to POST record, I receive the message: ActionController::ParameterMissing (param is missing or the value is empty: player_bonuse)在使用 Ajax 发布记录时,我收到消息:ActionController::ParameterMissing (param is missing or value is empty: player_bonuse)
【发布时间】:2019-05-19 11:22:58
【问题描述】:

我已阅读所有有关 csrf 身份验证和使用 ajax 发布记录的帖子,并进行了更改。尽管“无法验证 CSRF 令牌真实性”问题已经消失,但我仍然怀疑这可能仍然是问题所在。我正在使用 Rails 5.1。我在这个问题上工作了很长时间,希望能得到帮助。

应用程序的这一部分有一个带有轮子的 HTML 表单,该轮子是使用 jquery 旋转的。表单从控制器接收隐藏数据,jquery 脚本从表单访问这些数据。旋转的结果位置提供了要写入 PlayerBonuses 表的其余数据。当程序尝试将此结果发布到表时会出现问题。

底部是三个测试中返回的数据和错误消息。我可以看到数据没有任何缺失的列。

  1. Ajax 脚本 - data: player_bonuse and dataType: 'json'

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

  3. 为了比较起见,数据是通过Rails的restful方法正常输入奖励数据返回的。

注意:

a) 数字 1 更接近于宁静的结果

b) 数字 2 包括参数名称“player_bonuse”(与 restful 结果一样)

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

d) 虽然不再显示真实性错误,但也不显示 3 中存在的 header 中的 CSRF 数据。

提前感谢您提供的任何帮助/见解。

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#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"} 2ms 完成 400 Bad Request (ActiveRecord: 0.0ms)

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} 2ms 完成 400 Bad Request (ActiveRecord: 0.0ms)

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

如果通过 Rails Restful Process 添加奖励的结果:

"authenticity_token"=>"nkcECEzAYJQvDQ26/Ij5eslDOzk8umY/c0aexJGCVsWR1F6CYl+7SH4FgcJhaBS656CRf5rl0Ipa3W0tVksCRA==", "player_bonuse"=>{"user_id"=>"1", "bonus_table_reference_id"=>"11," "2", "award_reference_id"=>"1", "date_awarded(3i)"=>"18", "date_awarded(2i)"=>"12", "date_awarded(1i)"=>"2018", " Award_amount"=>"10000"}, "commit"=>"创建"}


【问题讨论】:

  • 您是否尝试将player_bonuse 放入params 对象中?喜欢:params: { player_bonuse: ... }...
  • 谢谢Thanh。解决问题后我才看到这篇文章,但我非常感谢您的意见!

标签: jquery ruby-on-rails ajax csrf


【解决方案1】:

我不知道,但有一次像这样尝试

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,感谢您的帮助。我收到以下错误消息:
  • 抱歉 - 在完成之前按 Enter。 “ArgumentError(错误数量的参数(给定 8,预期 0..1)):”由于只显示 6 个参数,我假设其他两个是 csrf 凭据?
  • 哎呀 - 它似乎只是在评论许可语句中的列数 - 其中有 8 个。我不发送 :id 或 :search 因为 :id 是在保存和 :search 时创建的以 :index 形式使用。这没关系,不是吗?
  • 那么不要将这两个参数值发送到 permit 和 new 语句中
  • 我把那些字段拿出来,现在得到; Completed 500 Internal Server Error in 15349ms (ActiveRecord: 0.0ms) ArgumentError (error number of arguments (given 6, expected 0..1)): The 500 error is on the previous error as well.
【解决方案2】:

如果没有 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');
           }           
          });

我的控制器没有变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多