我在我的routes.rb
中有resources :tags
。如何將此路線重寫爲更短?
所以當我去/tags/ios
,它顯示正確的Tag#Show
視圖。
我想發生這樣的是當用戶進入/tags/ios
它顯示了它作爲/ios
,我同樣希望生成路徑總是/ios
(而不是有領導/tags
)。
這裏是我如何渲染鏈路,each
塊中的一個例子:
<%= link_to "#{tag.name}", url_for(tag) %>
我在我的routes.rb
中有resources :tags
。如何將此路線重寫爲更短?
所以當我去/tags/ios
,它顯示正確的Tag#Show
視圖。
我想發生這樣的是當用戶進入/tags/ios
它顯示了它作爲/ios
,我同樣希望生成路徑總是/ios
(而不是有領導/tags
)。
這裏是我如何渲染鏈路,each
塊中的一個例子:
<%= link_to "#{tag.name}", url_for(tag) %>
所以即使我從這些人那裏得到了很多好的建議,但我發現我認爲對我來說是最好的解決方案。
我所要做的一切基本上都是將/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 => /.*/ }
以及這裏的問題是命名空間
,如果你這樣定義
獲得路線「 /(: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?
在你的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}")
當我在這樣一個URL上:'http:// localhost:3000/tags/ruby-on-rails'時,這就是參數的樣子:'Request parameters \t {「action」=>「show」 ,「controller」=>「tags」,「id」=>「ruby-on-rails」}' – marcamillion
如果你想要它匹配,那麼只需使用'match'/:id'=>'tags#show' ' – tybro0103
好....完美...所以現在'/ tags/ruby-on-rails'與'/ ruby-on-rails'走到了同一個地方。但是......在每個鏈接中生成的路徑仍然是'/ tags/ruby-on-rails'。另外...如果用戶轉到'/ tags/ruby'我想讓地址欄中的URL讀取'/ ruby'。所以我不只是想要一個匹配,而是基本上重新編寫一個URL,並且在生成的'url_for'路徑中重寫。 – marcamillion
我沒有使用蛞蝓。只是'Tag'的'name'屬性。 – marcamillion
這是一個完美的方式來做到這一點。什麼是所有的'救援'雖然...你不相信你自己的代碼? – tybro0103
這似乎有點沉重和低效率,沒有?在每次請求時,我都會做一個'Tag.all.each'。在我的情況下,我有1300多個標籤,所以我可以看到它非常難看,非常快 - 或者我錯過了什麼? – marcamillion