【发布时间】:2019-05-19 11:22:58
【问题描述】:
我已阅读所有有关 csrf 身份验证和使用 ajax 发布记录的帖子,并进行了更改。尽管“无法验证 CSRF 令牌真实性”问题已经消失,但我仍然怀疑这可能仍然是问题所在。我正在使用 Rails 5.1。我在这个问题上工作了很长时间,希望能得到帮助。
应用程序的这一部分有一个带有轮子的 HTML 表单,该轮子是使用 jquery 旋转的。表单从控制器接收隐藏数据,jquery 脚本从表单访问这些数据。旋转的结果位置提供了要写入 PlayerBonuses 表的其余数据。当程序尝试将此结果发布到表时会出现问题。
底部是三个测试中返回的数据和错误消息。我可以看到数据没有任何缺失的列。
Ajax 脚本 - data: player_bonuse and dataType: 'json'
带有 - 数据的 Ajax 脚本:JSON.stringify({player_bonuse})
为了比较起见,数据是通过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