【问题标题】:ActionController::UnknownFormat in StocksController#searchStocksController#search 中的 ActionController::UnknownFormat
【发布时间】:2019-12-07 22:24:18
【问题描述】:

我第一次尝试在教程中使用 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>

【问题讨论】:

    标签: javascript ruby-on-rails ajax ruby-on-rails-6


    【解决方案1】:

    你不应该像#results而不是#result一样

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

    【讨论】:

      【解决方案2】:

      如果发现@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 %>
      

      【讨论】:

      • 我建议您为搜索结果返回一个带有限制/分页的列表并全部渲染。只返回 1 个搜索结果可能会让用户感到沮丧。
      • 虽然这很好,但当我找不到东西时,它工作正常......当它找到库存时页面工作不正常......有什么想法吗?
      • 另外,至于分页,因为他们输入的是股票的确切代码,所以应该总是只有一个结果......除非我不明白股票是如何运作的。它也是一个教程,所以我这样做的主要原因是让 ajax 工作。这不会离开开发阶段。
      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多