首页 > 解决方案 > 修改现有 Rails 应用程序中的路线

问题描述

我尝试修改 Rails 应用程序中的现有路线,以使其对人类和谷歌更具可读性。

现有路线示例:http://localhost:3000/search_adv?locale=de&q[home_type_eq]=1

To:http://localhost:3000/bowling?locale=de 如何在不修改“大”代码的情况下创建这些路线?

其中 home_type=1 参数对应保龄球。home_type=2 到餐厅等等。总共有六个这样的参数。

在 routes.rb 中: get 'search_adv' => 'pages#search_adv' 在控制器中:

  def search_adv
    if params[:search_adv].present? && params[:search_adv].strip != ""
      session[:loc_search] = params[:search_adv]
    end

    if session[:loc_search] && session[:loc_search] != ""
      @rooms_address = Room.where(active: true).paginate(page: params[:page], per_page: 10).near(session[:loc_search], 1000, order: 'distance')
    else
      @rooms_address = Room.where(active: true).paginate(page: params[:page], per_page: 10)
    end

标签: ruby-on-railsrubyroutes

解决方案


你的问题表明你是如何考虑 Rails 的,这不是正确的方法,我也会建议 Tom Lord 的建议,但有一种方法可以做你想做的事,尽管这需要对你的代码库进行重大重构并且不值得它:

您可以为 home_types(餐厅、保龄球等)分别添加一个 M、V 和 C,然后search_adv根据参数从方法重定向到该控制器路由。

例如:

你打http://localhost:3000/search_adv?locale=de&q[home_type_eq]=1然后进去search_adv你就可以了

  if params[the exact params containing your value] == 1
    redirect_to bowlings_path(locale: 'de')
  end

用户不会感觉到它,因为重定向将在后端发生,但稍后的路由将如下所示:

  http://localhost:3000/bowlings?locale=de

推荐阅读