Rails - 如何将生成的 URL 修复为友好的 URL

Posted

技术标签:

【中文标题】Rails - 如何将生成的 URL 修复为友好的 URL【英文标题】:Rails - How to fix the generated URL to be a friendly URL 【发布时间】:2011-08-14 06:33:39 【问题描述】:

我的模型看起来像

search.rb:
  id eg: 101
  name eg: San Francisco

cars.rb
  id
  name

搜索控制器将用户重定向到汽车。

search_controller.rb
if search.search_type=='cars'
  redirect_to :controller=>'cars', :action=>'index', :id=>search
end

查找来自旧金山的汽车列表的查询如下所示:

http://localhost/cars?id=101

我在 search.rb 中覆盖了 to_param 方法,例如:

search.rb
def to_param
  normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
  "#self.id-#normalized_name"
end

这在某种程度上有效: 它生成如下所示的 URL:

http://localhost/cars?id=101-San-Francisco

但是,我想生成一个看起来像这样的 URL

http://localhost/cars/San-Francisco

我该怎么做呢? 我要修路线吗?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

如果您没有做好准备,这可能会很棘手。正如您所确定的,控制模型如何在参数中显示的方法非常简单,但这只是其中的一半。稍后您必须检索它,因此您需要为此进行设置:

class Search < ActiveRecord::Base
  before_save :assign_slug

  def self.from_param(id)
    self.find_by_slug(id)
  end

  def to_param
    self.slug
  end

protected
  def assign_slug
    self.slug = self.name.gsub(' ', '-').gsub(/[^\w\-\.]/, '')
  end
end

这需要在您的搜索模型中添加一个slug 列,以便可以通过它查找搜索。添加索引(可能是唯一的索引)可能是个好主意,以帮助以后以有效的方式检索这些。

在您的控制器中,您不使用 find 而是使用 from_param 来进行检索。

您还需要添加一个采用此参数的自定义路由:

match '/cars/:search', :to => 'cars#index', :as => 'cars_search'

请注意,您应该尽可能使用路由路径生成器方法,因为多个路由可能匹配相同的参数。例如:

redirect_to cars_search_path(:search => search)

【讨论】:

以上是关于Rails - 如何将生成的 URL 修复为友好的 URL的主要内容,如果未能解决你的问题,请参考以下文章

Rails 6 - 将 URL 中 root_path 的参数更改为 SEO 友好的 URL

如何将门户 URL 转换为其对应的友好 URL

seo 友好的 url 使用西里尔字符 х 字符,它总是得到 404。如何修复它?

如何让 rails 路由助手始终使用 to_param 生成路径,即使我只是传入 ActiveRecord ID?

Rails 4中友好id gem的随机slug url

Rails 3-修复涉及模板和 JS 生成器的主宰