无法使用Rails在Ajax请求中通过url传递参数

时间:2016-12-13 08:26:18

标签: javascript jquery ruby-on-rails ajax

我试图通过确认对话触发的Ajax请求中的url传递参数。我想在成功请求的情况下在我的Rails控制器中获取该参数的值,但我还没有能够做到。

到目前为止,我已尝试过以下代码:

这是我的Ajax请求,我在网址中添加了参数以及数据中的其他参数

function continueSave() {
  var name = $('#leader_name').val();
  var persisted_time = $('#leader_time').val();

  $.ajax({
    type: "POST",
    url: "/leaderboards/1/?test=1",
    data: { leader: { name: name, time: time } },
    success: success

  });
}

这里是与对话相关的JS

function nameAlert() {
  return confirm("Name already exists. Would you like to continue?");
};

(function() {
  if (nameAlert()) {
    continueSave();
  }
else {
    //something else here
   }
})();

虽然请求成功到达控制器,但控制器中的参数[:test]为零。

我还尝试在数据中传递测试参数,但它也无法正常工作。

会感激一些帮助。

相关的控制器操作(leaders_controller.rb)

  def create
    @leader = Leader.new(leader_params)
    @leader.leaderboard_id = @leaderboard.id
    @name_repeated = !@leaderboard.leaders.find_by(name: @leader.name).nil?
    @check = params[:test]

     if params[:test].nil? && @name_repeated == true
       render :template => 'leaders/repeated_name.js.erb'
     else
      @leader.save
      @rank = @leader.rank_in(@leaderboard)

      respond_to do |format|
        if @leader.save
          format.html { redirect_to root_path }
          format.js { }
        else
        end
      end
    end
  end

注意: 1.-' leaders / repeated_name.js.erb'包含Ajax请求的代码 2.-在路线中Leader资源嵌套在Leaderboard资源

2 个答案:

答案 0 :(得分:1)

对不起家伙我发现了这个错误。这是一个愚蠢的。 我有浅层嵌套路由,因此领导者嵌套在排行榜中,因此我使用了不正确的路径来处理请求。它应该是:

  $.ajax({
    type: "POST",
    url: "/leaderboards/1/leaders?test=1",
    data: { leader: { name: name, time: time } },
    success: success

  });

在对不起浪费你的时间之前我应该​​抓住了。

答案 1 :(得分:0)

我会在这里发帖 - 我的评论太长了。

尝试将{ type: 1}添加到data并将type更改为GET。 Rails params包含GETPOST数据 - 您甚至不需要更改控制器。

function continueSave() {
    var name = $('#leader_name').val();
    var persisted_time = $('#leader_time').val();

    $.ajax({
        type: "GET",
        url: "/leaderboards/1/",
        data: { leader: { name: name, time: time }, test: 1 },
        success: success
    });
}