簡體   English   中英

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

[英]how do I make the URL's in Ruby on Rails SEO friendly knowing a @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

所以這會給你這樣的網址

/ 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#parameterize,作為標記答案的補充。

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

它將過濾掉帶連字符的字符,用短划線替換空格等。

Ryan Bates在這個主題上有一個很棒的截屏視頻

基本上,您在供應商模型中重載了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知之甚少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM