2013-03-29 24 views
0

我在我的routes.rb中有resources :tags如何將此路線重寫爲更短?

所以當我去/tags/ios,它顯示正確的Tag#Show視圖。

我想發生這樣的是當用戶進入/tags/ios它顯示了它作爲/ios,我同樣希望生成路徑總是/ios(而不是有領導/tags)。

這裏是我如何渲染鏈路,each塊中的一個例子:

<%= link_to "#{tag.name}", url_for(tag) %> 

回答

0

所以即使我從這些人那裏得到了很多好的建議,但我發現我認爲對我來說是最好的解決方案。

我所要做的一切基本上都是將/tags/ruby渲染爲/ruby這兩個都在實際的URL上,在所有標記的鏈接上,並在URL欄中。

我不想做任何會增加我的應用程序的負載。

這是對我的作品的解決方案:

resources :tags, path: "", except: [:index, :new, :create] 

使用path:,你可以指定你想要顯示的路徑。即你想在你的資源之前出現什麼。所以如果你想讓你的網址看起來像myhotness/tags/ruby,那麼你只需要做path: "myhotness"

我不想在我的路徑中有任何東西,所以我只是將它留空。

對於它的價值,你可以約束甚至添加到這條路線,像這樣:

resources :tags, path: "", except: [:index, :new, :create], constraints: { :id => /.*/ } 
0

以及這裏的問題是命名空間

,如果你這樣定義

獲得路線「 /(:slug)「=>」Tags#show「

這將基本上匹配其中有效標籤的任何地方。我會做的方式,它是

在你的路由文件:

begin 
    Tag.all.each do |t| 
     begin 
     get "#{t.slug}" => "Tags#show" 
     rescue 
     end 
    end 
    rescue 
    end 
在標籤控制器

然後你可以

def show 
    slug = request.env['PATH_INFO'] 
    @tag = Tag.find_by_slug(slug) 
    end 

我的回答來自另一個答案,我寫的,你可能會感興趣How to create app-wide slug routing for Rails app?

+0

我沒有使用蛞蝓。只是'Tag'的'name'屬性。 – marcamillion

+0

這是一個完美的方式來做到這一點。什麼是所有的'救援'雖然...你不相信你自己的代碼? – tybro0103

+0

這似乎有點沉重和低效率,沒有?在每次請求時,我都會做一個'Tag.all.each'。在我的情況下,我有1300多個標籤,所以我可以看到它非常難看,非常快 - 或者我錯過了什麼? – marcamillion

0

在你的routes.rb

resources :tags 
match '/:tag_name' => 'tags#show' 

然後在你的tags_controller#show動作必須通過訪問標籤名稱:

params[:tag_name] 

務必把,在你的路由文件的末尾,因爲它會抓住一切。此外,由於它會抓住一切你應該呈現404,如果它不是一個有效的標籤名稱:

def show 
    unless @tag = Tag.where(name: params[:tag_name]).first 
     raise ActionController::RoutingError.new('Not Found') 
    end 
end 

重定向/標籤/紅寶石/紅寶石:

match "/tags/:tag_name" => redirect("/%{tag_name}") 

http://guides.rubyonrails.org/routing.html

+0

當我在這樣一個URL上:'http:// localhost:3000/tags/ruby​​-on-rails'時,這就是參數的樣子:'Request parameters \t {「action」=>「show」 ,「controller」=>「tags」,「id」=>「ruby-on-rails」}' – marcamillion

+0

如果你想要它匹配,那麼只需使用'match'/:id'=>'tags#show' ' – tybro0103

+0

好....完美...所以現在'/ tags/ruby​​-on-rails'與'/ ruby​​-on-rails'走到了同一個地方。但是......在每個鏈接中生成的路徑仍然是'/ tags/ruby​​-on-rails'。另外...如果用戶轉到'/ tags/ruby​​'我想讓地址欄中的URL讀取'/ ruby​​'。所以我不只是想要一個匹配,而是基本上重新編寫一個URL,並且在生成的'url_for'路徑中重寫。 – marcamillion