Rails-添加.js.erb文件时不会加载Ajax请求

时间:2018-12-14 22:36:18

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

如果您愿意,我正在尝试创建一个简单的网站,一个股票追踪器。功能之一是使用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时,请求根本不返回任何内容,并且页面未填充数据,则在没有js.erb文件时,请求仅返回200。这是代码:(_result.js.erb)

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

我不知道错误可能是什么。有人可以阐明这一点吗?

编辑:是的,答案是肯定的,是的,但是我发现您还可以传递一个渲染器来更改页面内容,$('#results').html("<%= j (render 'users/result') %>")实际上试图渲染页面,而实际目的只是为了获得页面的内容。为此,只需使用$('#results').html("<%= j (render partial:'users/result.html.erb') %>")即可。但是,html.erb部分似乎绝对必要,与其他地方不同。如果有人能指出原因,那就太好了。

1 个答案:

答案 0 :(得分:0)

似乎您已经关闭,问题在于将服务器渲染与客户端渲染混为一谈。您的JavaScript示例 的

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

只会在服务器上渲染1次,因此当您从ajax调用中获得响应时,它不会对客户端产生任何影响。

要使其正常工作,它必须是ajax或fetch调用的一部分,并且应类似于以下内容。

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

旁注,我也建议在此不提供ID。根据要请求的事物的ID,使用诸如数据选择器之类的东西。