【问题标题】:Ruby on Rails: How to redirect page based on post params in search_field?Ruby on Rails:如何根据 search_field 中的帖子参数重定向页面?
【发布时间】:2013-09-09 15:08:32
【问题描述】:

我正在开发一个小型股票市场应用程序,用户可以在其中根据股票代码查找公司股票信息。在用户在搜索字段中发布 :symbol 参数后,他们应该被重定向到适当的“公司”页面(如华尔街日报、雅虎财经、谷歌财经等)。我目前可以手动输入带有符号的路线,一切正常。例如,localhost:9292/company/GOOG。我是一个完全的菜鸟,所以任何帮助将不胜感激。谢谢!

我目前认为:

<%== search_field_tag(:symbol, "Enter symbol") %>
<%== submit_tag ("Search") %>

这是我的路线:

get  "/company/:symbol"  => "main#company"
post "/company/:symbol"  => "main#company_post"

编辑:我正在使用 MarketBeat gem 来提取数据,但我也有一个 Company 表,其中有列符号和名称。这是我的控制器:

class MainController < ApplicationController
def index
    render :index and return
end

def company
    @name = MarketBeat.company params["symbol"]
    @symbol = MarketBeat.symbol params["symbol"]
    @price  = MarketBeat.last_trade_real_time params["symbol"]
    @change = MarketBeat.change_and_percent_change params["symbol"]
    @volume = MarketBeat.volume params["symbol"]
    @days_range = MarketBeat.days_range params["symbol"]
    @eps = MarketBeat.earnings_to_share params["symbol"]
    @pe = MarketBeat.pe_ratio params["symbol"]
    @stock_exchange = MarketBeat.stock_exchange params["symbol"]


    market_cap = MarketBeat.market_capitalization params["symbol"]
    # @market_cap is rounded to billions
    @market_cap = market_cap.to_i / 1000

    render :company and return
end

【问题讨论】:

  • 我需要查看你的主要控制人和公司的行动来帮助你,在你的行动中params[:symbol]的值应该在搜索输入时可用

标签: ruby-on-rails search redirect params


【解决方案1】:

在您的 main#company_post 方法中,输入以下内容:

redirect_to "/company/#{params[:symbol]}"

所以路线应该是:

get  "/company/:symbol"  => "main#company"
post "/company"  => "main#company_post"

控制器:

def company_post
  redirect_to "/company/#{params[:symbol]}"
end

观点:

<%= form_tag("/company", method: :post) do %>
  <%= search_field_tag(:symbol, "Enter symbol") %>
  <%= submit_tag ("Search") %>
<% end %>

【讨论】:

  • 我用你的建议替换了“render :company and return”,但我得到了一个重定向循环
  • 是的,你不想把它放在main#company 方法中,否则它会重定向到自己。您需要将其放入处理您的POST /company/:symbol 请求的任何操作中,尽管我在您的控制器代码中没有看到它。您需要在某处使用main#company_post 方法。另外,我会将:symbolpost "/company/:symbol" 路由中取出,因为:symbol 将在该请求的正文中。我将在答案中添加控制器代码。
  • 非常感谢您的帮助。我仍然收到以下错误:ActionController::InvalidAuthenticityToken in MainController#company_post ActionController::InvalidAuthenticityToken
  • 是的,上面的视图代码不能逐字运行,因为它不允许 Rails 放入 CSFR(真实性)令牌。您要么需要使用 rails form_tag 查看帮助程序,要么跳过验证,首选前者。我会尝试添加表单标签代码,但它可能需要一些调整,我没有经常使用它。
【解决方案2】:

在您的 #company 控制器方法结束时,您可能会执行类似的操作

render "#{params[:symbol]}"

render partial: "#{params[:symbol]}"

还有一个与公司同名的模板文件,比如google.html.erb

试一试!

【讨论】:

    【解决方案3】:

    我做了一个看起来几乎像你的任务的简单搜索系统

    完整示例

    routes.rb

      post 'search'          => 'vids#prepare_search', as: :prepare_search_vids
      get  'search(/*query)' => 'vids#search',         as: :search_vids
    

    vids_controller.rb

      # GET /search(/*query)
      def search
        @results = Title.search params[:query] if search_query?
        if @results.count == 1
          flash[:notice] = I18n.t 'vids.search.signle_result'
          redirect_to @results[0].vid
        end
        @query = params[:query]
      end
    
      # POST /search
      def prepare_search
        query = params[:q] ? params[:q] : ''
        redirect_to search_vids_path(query)
      end
    
      private
    
        def search_query?
          params[:query] and !params[:query].blank?
        end
    

    另外,在您的情况下,我建议在路由 http://guides.rubyonrails.org/routing.html#route-globbing-and-wildcard-segments 中使用星号而不是冒号

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 2019-12-12
      相关资源
      最近更新 更多