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

AFG*_*AFG 11 ruby ruby-on-rails

我的申请是在RoR

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

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

我怎么做?

Cod*_*lan 7

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

vendor.rb

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

所以这会给你这样的网址

/ 1-Acme的

/ 19-西夫韦

等等

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

Vendor.find(params[:id])
Run Code Online (Sandbox Code Playgroud)

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

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

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

但如果你想让他们看看

/ 1-Acme的

然后有一条路线

map.show_vendor '/:id', :controller => 'vendors', :action => 'show'
Run Code Online (Sandbox Code Playgroud)

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


Aug*_*aas 6

我以为我会提到String#parameterize,作为标记答案的补充.

def to_param
  "#{id}-#{name.parameterize}"
end
Run Code Online (Sandbox Code Playgroud)

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