【问题标题】:Render a view in rails via AJAX and controller通过 AJAX 和控制器在 Rails 中渲染视图
【发布时间】:2017-03-18 20:34:28
【问题描述】:

我的 application.js 中有这个 JS 代码:

  $(document).ready(function(){
        var kraken_btc_eur_old = 0;

        setInterval(function(){

            $.get('https://api.kraken.com/0/public/Ticker?pair=XXBTZEUR', function(data){

                var kraken_btc_eur = data.result.XXBTZEUR.c[0];
                kraken_btc_eur_old = kraken_btc_eur;
                $(".kraken_btc_eur").text(kraken_btc_eur);

            });

            $.ajax({
              type: "POST",
              url: "/bets",
              data: { parameter: kraken_btc_eur_old },
              success: function (data) {

               }        
            });

        }, 10000);

    });

到目前为止一切顺利,页面每 10 秒显示一次从 API 获取的新值,并将其放置到 HTML 中的相应类中,无需任何页面刷新。 我的问题是 AJAX 请求。我可以在 Rails 控制台中看到,每 10 秒发布请求都会触发我控制器中的创建操作,并且相应地执行代码:

def create
    @bet = Bet.new
    @bet.base_price = params["parameter"]
    @bet.save  
    Bet.first.destroy

    @bets = Bet.all
    @bet_last = Bet.last

    #render :js => "window.location = '#{root_path}'"
    #redirect_to "index"
    #render :inline => "<% @bets.each do |b| %><p><%= b.id %><p><% end %>"

  end

但是,我无法在不刷新页面的情况下使用新值更新 html 视图。因为每 10 秒都会创建新的投注 (AJAX),所以我希望它们自动出现在页面中,无需进行任何刷新。 我尝试在我的创建操作中以不同的方式呈现,我意识到在我的浏览器控制台中的 ressources -> XHR 下创建了带有更新的 htm 的文档,但我没有设法将其替换为显示的文档而不进行任何刷新。

【问题讨论】:

    标签: javascript ruby-on-rails ajax


    【解决方案1】:

    当您发送 AJAX 请求时,rails 将无法更新您的视图。那是因为,正如您所说,您实际上并没有刷新页面。所以 rails 无法将新的 HTML 内容发送到浏览器。

    在这种情况下,您需要处理在前端 (Javascript) 中添加新 Bet 的逻辑。

    类似:

    $.ajax({
      type: "POST",
      url: "/bets",
      data: { parameter: kraken_btc_eur_old },
      success: function (data) {
        var newBet = "<div>" + data.base_price + "</div>";
        $('list_of_bets').append(newBet);
      }
    });
    

    在 Rails 方面,您需要将刚刚创建的新 Bet 返回为 JSON:

    def create
      # your logic here 
      render json: @bet
    end
    

    【讨论】:

    • 老兄,你不知道你为我节省了多少时间。我已经尝试了 2 天这么多不同的代码。非常非常感谢!