在铁路的SEO友好的url

时间:2012-08-18 16:17:07

标签: ruby-on-rails ruby ruby-on-rails-3

我正在为最后几分钟假期建立一个网站。

现在我正在忙着建立seo友好网址。每个最后几分钟都有一个国家和一个城市。我想让网址看起来像是以下几种方式:

对于每个国家/地区包含所有最后分钟数的页面:
“domain.com/last-minutes-spain”

对于每个城市包含所有最后分钟数的页面:
“domain.com/last-minutes-spain/barcelona”

每个国家/地区的所有最后几分钟页面的网址都正常工作,但每个城市页面的网址不是。

我的路线(我使用的是friendly_id宝石):

match '/last-minutes-:id' => 'countries#show', :as => 'show_country'
match "/last-minutes-:country_id/:id" => 'city#show', :as => 'show_city'

countries_controller.rb:

def show
  @country = Country.find(params[:id])
end

国家/ show.html.erb:

<% @country.cities.each do |c| -%>
  <%= link_to(c.title, show_city_path(c.slug)) %><br />
<% end -%>

c.slug用于friendly_id gem

显示城市路径(每个城市的最后几分钟)显示以下内容:
“domain.com/last-minutes-barcelona/spain”

所以这个城市和国家都在错误的地方。有谁知道怎么做对吗?

1 个答案:

答案 0 :(得分:0)

您真正想要做的是在模型中查看覆盖to_param。

每当有任何调用尝试构建涉及模型的路径时,都会在模型实例上调用to_param方法,以确定如何在URL中引用它。换句话说,路线中对应于:id的部分。如果您只是覆盖此方法,则可以返回任何想要的内容。绝对最简单的方法是将整数ID保留为第一个值。像这样:

def to_param
  return "#{self.id}-#{self.text_for_seo}"
end

就是这样。事实上,我昨天记录了一个演练。第一件事,非常快,正是你正在尝试的。然后,它继续解释如何将其用于支持加密的数据库ID:http://www.youtube.com/watch?v=UW_s9ejrCsI