【问题标题】:Rails - Ajax request doesn't load when I add .js.erb fileRails - 添加 .js.erb 文件时未加载 Ajax 请求
【发布时间】:2018-12-14 22:36:18
【问题描述】:

我正在尝试做一个简单的网站,如果你愿意的话,是一个股票跟踪器。其中一项功能是使用 ajax 获取结果,因为不加载整个页面,我可以尽可能地将带有我想要的数据的 html 获取到响应中,但无法将其加载到页面中。当我添加等效的 js.erb 文件时,我根本没有得到任何响应。

这是页面:(my_portfolio.html.erb)

    <h1> My Portfolio</h1>

<h3>Search for stocks</h3>
  <div id="stock-lookup">
    <%= form_tag search_stocks_path, remote: true, method: :get, id: "stock-lookup-form" do %>
    <div class="form-group row no-padding center col-md-12">
      <div class="col-md-10">
        <%= text_field_tag :stock, params[:stock], placeholder: "Stock ticker symbol", autofocus: true,
                           class: "form-control search-box input-lg" %>
      </div>
      <div class="col-md-2">
        <%= button_tag :submit, class: "btn btn-lg btn-success" do %>
          <%= fa_icon "search" %> Look up a stock

        <% end %>
      </div>


    </div>
    <% end %>

  </div>
  <div id="results">
    <%= render 'users/result' %>
  </div>

这是在底部呈现的部分:(_result.html.erb)

<% if @stock %>
  <div class="well results-block">
    <strong>Symbol: </strong><%= @stock.ticker %>
    <strong>Name: </strong><%=@stock.name %>
    <strong>Price: </strong><%= @stock.last_price %>
  </div>
<% end %>

这是您提交表单时运行的方法 (stocks_controller.rb):

class StocksController < ApplicationController
  def search

    if params[:stock].present?
      @stock = Stock.new_from_lookup(params[:stock])
      if @stock
        respond_to do |format|
          format.js { render partial: 'users/result' }
        end
      else
        flash[:danger] = "You have entered an invalid symbol."
        redirect_to my_portfolio_path
      end

    else
      flash[:danger] = "You have input an unexistant stock."
      redirect_to my_portfolio_path
    end

  end
end

这是我的问题:当我提交有效输入时,我在浏览器中检查服务器响应,然后我看到响应文本:

  <div class="well results-block">
    <strong>Symbol: </strong>GOOG
    <strong>Name: </strong>Alphabet Inc.
    <strong>Price: </strong>1042.1
  </div>

这意味着我正在取回数据,但是,尝试将其放在页面上是行不通的,因为当我创建适当的 _result.js.erb 时,请求根本不会返回任何内容,并且页面不是t 填充数据,请求仅在没有 js.erb 文件时返回 200。这是代码:(_result.js.erb)

$('#results').html("<%= j (render 'users/result') %>")

我不知道错误可能是什么。有人能解释一下吗?

编辑:批准的答案有效,是的,但我发现您也可以通过渲染来更改页面内容,并且 $('#results').html("&lt;%= j (render 'users/result') %&gt;") 实际上尝试渲染页面,而实际意图只是获取 html,为此,只需使用 $('#results').html("&lt;%= j (render partial:'users/result.html.erb') %&gt;") 代替。但是,html.erb 部分似乎是绝对必要的,这与 rails 中的其他任何地方不同。如果有人能指出原因,那就太好了。

【问题讨论】:

    标签: javascript jquery ruby-on-rails ajax ruby-on-rails-5


    【解决方案1】:

    您似乎已经很接近了,问题是将服务器渲染与客户端渲染混为一谈。您的 JavaScript 示例 的

    $('#results').html("&lt;%= j (render 'users/result') %&gt;")

    只会在服务器上渲染 1 次,所以当你从 ajax 调用得到响应时,它不会对客户端产生影响。

    为了使它工作,它需要成为 ajax 或 fetch 调用的一部分,并且应该看起来像这样。

    html_results_string = "YOUR RAW HTML RESPONSE"
    $('#results').html(html_results_string)
    

    旁注,我也建议不要在这里使用 id。根据您请求的事物的 id 使用数据选择器之类的东西。

    【讨论】:

    • 但是我怎么才能得到这个原始的html呢?
    • 我不确定我是否完全理解了这个问题。您将使用您在前端配置的任何内容来执行 javascript xhr,只是从您的问题中猜测它可能是$.get。 `html_results_string 将是该 ajax 请求的结果。
    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多