如何在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
- 将保存/更新调用rails转换为sql
- 如何重用查询结果,以便在不使用全局或会话变量的情况下更快地导出到csv和xls
- Ruby – 找到散列中最大值的键
- Active Merchant – 未初始化的常量ActiveSupport :: XmlMini_REXML :: StringIO
- 基于params的动态ActiveRecord查找器方法链接
- 用于telnet切换的Ruby脚本
- 自定义响应者应该在Rails项目中的哪个位置?
- Rails 5 ActionController :: InvalidAuthenticityToken错误
- Ruby 1.8.7(或Rails 2.x)中的String.force_encoding()