如何在Ruby on Rails SEO中建立URL,知道@ vendor.name?

我的申请是在RoR

我有一个名为showsummary的操作/视图,其中ID已传递到URL,控制器已使用它来实例化@vendor,其中@ vendor.name是公司的名称。

我希望URL而不是showsummary / 1 /在URL中具有/ vendor-name。

我怎么做?

所有这些解决方案都使用find_by_name ,这肯定需要在该列上有索引并要求它们是唯一的。 我们使用的更好的解决方案是牺牲少量的美感,使用前缀为供应商名称及其ID。 这意味着您不必在名称列上有索引和/或需要唯一性。

vendor.rb

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

所以这会给你像这样的url

/ 1-Acme的

/ 19-西夫韦

等等

然后在你的节目动作中你仍然可以使用

 Vendor.find(params[:id]) 

因为该方法将隐式地在其参数上调用to_i ,并且在这样的字符串上调用to_i将始终返回数字前缀并删除剩余的文本 – 它在该点处的所有绒毛。

以上假设您使用的是/:controller/:action/:id的默认路由,这将使您的URL看起来像

商/供应商/显示/ 1- Acme的

但如果你想让他们看看

/ 1-Acme的

然后有一条路线

 map.show_vendor '/:id', :controller => 'vendors', :action => 'show' 

这意味着它几乎可以吞下很多你可能不想要它的URL。 引以为戒。

我以为我会提到String#参数化,作为标记答案的补充。

 def to_param "#{id}-#{name.parameterize}" end 

它将过滤掉带连字符的字符,用短划线替换空格等。

Ryan Bates在这个主题上有一个很棒的截屏video 。

基本上,您在供应商模型中重载了to_param方法。

  def to_param permalink end 

然后,当您在控制器中查找资源时,执行以下操作:

  @vender = Vender.find_by_name(params[:id]) 

但问题是您必须确保供应商的名称是唯一的。 如果他们不能那么做Ryan建议的其他解决方案,他将id添加到名称,然后解析生成的uri以找到项ID。

您可以通过修改用于访问这些URL的路由并将其更改为使用来执行此操作:name,而不是:id。 这可能意味着您必须自己编写路线而不是依赖资源。

例如,将其添加到routes.rb文件中:

 map.with_options :controller => "vendor" do |vendor| vendor.connect "/vendor/:name", :action => "show" # more routes here for update, delete, new, etc as required end 

需要进行的另一项更改是,现在您必须通过名称而不是ID在数据库中查找供应商对象,因此:

 @vendor = Vendor.find_by_name(params[:name]) 

在内部(至少根据我的知识/实验),路由的URL部分中没有指定任何参数名称(即不在“/ Controller / Action /:id”部分内),作为参数添加到最后。

我必须尝试一下才能做到正确,但解决方案有两个主要部分。

1)添加路线。 在config / routes中,添加一行,将表单baseurl / controller /:vendor-name的请求发送到动作showummary,(或者可能是一个新动作,show_summary_by_vendor_name)[另外,如果你计划使用baseurl /:vendorname,那就是为方便起见,请确保参数类似于:vendor-name,而不是默认值:id

2)写下控制器动作。 在控制器文件中,编辑您的showummary操作以根据是使用id还是vendorname调用来区分,或者只编写show_summary_by_vendor_name。 (取决于最佳实践,以及你在1中写道的路线。我不知道我的头脑哪个更好)你可以做@vendor = Vendors.find_by_name(params [:vendor_name])或类似的东西,然后按照常规showummary中的方式呈现它。

3)使用它作为链接。 确认baseurl [/ controller?] / vendor-name有效并显示摘要后,请确保应用程序和其他地方的所有链接都使用该链接。 在我的脑海中,我不记得将自定义路线集成到link_to是多么困难,但我认为这是可行的。 大多数搜索引擎[谷歌]严重依赖链接,所以好的搜索引擎优化将让你使用这些命名链接,而不是编号链接。 我认为。 我对SEO知之甚少。

看看这个quck开始的SEO for Rails