ActionController::UnknownFormat 在 StocksController#search

ActionController::UnknownFormat in StocksController#search

我第一次尝试在教程中使用 Ajax。目标是输入股票标识符,按下按钮,它会在同一页面上显示有关该股票的信息,而无需重新加载。我没有收到任何错误消息,当我进入控制台时,它会在网络响应下显示带有正确股票信息的部分 HTML 代码,只是不会将其推送到屏幕上。当我单击网络响应时,出现未知格式错误。

相关代码:

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
            puts "incorrect symbol"
            flash[:danger] = "You have entered an incorrect symbol."
            redirect_to my_portfolio_path
      end

      else
         puts "nothing"
         flash[:danger] = "You need to type something, what did you expect to happen?"
         redirect_to my_portfolio_path
      end
   end
end

部分结果:

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

结果 JS erb

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

网页本身

<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%>
        <row>
            <div class = "form-group row no-padding text-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(type: :submit, class:"btn btn-lg btn-success") do%>
                        <i class = "fa fa-search"></i> Look Up A Stock
                    <%end%>
                </div>    
            </div>

        </row>


    <%end%>
</div>

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

如果发现 @stock,则您使用的 JS 格式正确。但是当你不重定向到 my_portfolio_path 时,我假设此操作正在返回格式 HTML。为什么重定向到 my_portfolio_path?我认为对于您的 AJAX 路线,这不是必需的。

我认为这个例子更适合您的 SearchController:

class StocksController < ApplicationController 
  def search
    @stock = Stock.new_from_lookup(params[:stock])
    flash[:danger] = "No stock found." if @stock.nil?
    respond_to do |format|
      format.js {render partial: 'users/result'}
    end 
  end
end

这是您的 JS 模板:

<% if @stock %>
  $('#results').html("<%=j (render 'users/result.html')%>");
<% else %>
  console.log("No stock found! It's up to you what to do in frontend.")
  // showing some flash!
  // however_you_render_flash_in_you_app();
<% end %>

你不应该像

这样的 #results 而不是 #result
$('#results').html("<%=j (render 'users/result.html')%>")