2013-10-04 62 views
3

我在使用導軌路線時有點困惑。我需要一些關於自定義我的網址的建議。定製導軌路由網址

這是我當前的URL

http://localhost:3000/posts/product/41?product_id=2

http://localhost:3000/posts/product/41?model_id=24&product_id=2

這是我的鏈接

<%= link_to product_model.name, controller: :posts,action: :product,product_id: params[:product_id],model_id: product_model.id 

按道理產品應該首先在URL。但爲什麼模型首先在這裏。

,我需要我的網址是這樣的

http://localhost:3000/posts/product/41/mobile

http://localhost:3000/posts/product/41/mobile/nokia

由於我不熟悉的軌道路線,我沒有寫任何特殊的編碼在我的路線

以下是存在的簡單路線

resources :posts 
+1

可以使用友好-ID的寶石。 –

+0

@AmitSharma是的,我只使用friendly-id,但我可以像上面那樣工作 – overflow

+0

@Seting,在您當前的URL中,「41」代表什麼? –

回答

7

確定你的問題在這裏實際上包含兩個不同的問題,所以我會給兩個建議。

1嵌套資源

你的第一個問題是使用「嵌套的路線」。 Rails指南有關於路由以及如何編寫和使用它們的長篇很好的文章,包括嵌套路由。你可以在這裏查看:http://guides.rubyonrails.org/routing.html#nested-resources

然而,在您的情況會解決這個樣子:

resources :category do 
    resources :sub_category do 
    resources :products do 
     resources :models 
    end 
    end 
end 

你可以這樣

<%= link_to product_model.name, category_sub_category_product_model_path(@category, @sub_category, @product, product_model) %> 

現在馬麗娟鏈接你可以看到,我已刪除的帖子,看到3。重構設計查看原因。如果你真的想這個是有職位的行動,你應該然而這樣做(但會推薦!):

get "posts/product/:category_id/:subcategory_id/:product_id/:model_id", to "posts#product", as: :posts_product 

這將在您的視圖中使用這樣的:

<%= link_to product_model.name, posts_product_path(@category, @sub_category, @product, product_model) %> 

2.漂亮的網址

你的第二個問題是在你的網址中使用模型名稱而不是id。這個simpels解決方案在模型上有一個唯一的屬性,您可以使用它來代替id,然後只需添加to_param方法。 Fx的產品,我們可以做這樣的事:

class Product < ActiveRecord::Base 
    def to_param 
    name 
    end 
end 

瑞安貝茨已經取得了不錯的截屏這一點:http://railscasts.com/episodes/63-model-name-in-url-revised。如果您想使用寶石Friendly Id更靈活。 Ryan又一次用另一個偉大的RailsCast來拯救:http://railscasts.com/episodes/314-pretty-urls-with-friendlyid

3.更改設計

好舒服,所以這只是我的意見,隨時忽略它。但是他們的例子中有一些不好的做法和跡象,所以讓我快速瀏覽一下我認爲你應該改進的地方。

寧靜行動

你應該儘可能總是避免創建控制器動作不是寧靜(簡單地說是基本動作指數,顯示,新,創建,編輯,更新和銷燬只有寧靜行動)。在你的例子中,這是否意味着帖子控制器的產品動作​​應該改變爲寧靜。爲什麼不把它移到產品模型控制器並稱之爲「show」?

深度嵌套資源

你應該避免嵌套的路線深入。在網址中顯示類別,子類別,產品和模型是否非常重要?也許這就是你的模型在你的應用程序內部是如何關聯的,但爲什麼用戶應該知道這一點?如果您在「/ posts/product」沒有子類別列表,並且「posts/product/41」中的產品列表沒有理由有這麼長的路線。經驗法則是「嵌套不深於兩層」,即。 「:類別/:sub_category」。更短的路線意味着更好的搜索引擎優化。

正如我所說的,隨意忽略這些建議,您的應用程序將工作沒有這些變化。然而,改變這些東西將大大幫助你構建代碼,並保持你的代碼庫清潔和可維護。這些規則和原則並不是我剛從無到有,但在Rails社區中非常公認的原則。你可以谷歌每個這些原則或模式,並看到很多文章和帖子,爲什麼這是一個好主意,按照他們,特別是當你使用Rails。

資源

1

model.rb

def to_param 
    name 
    end 

添加到您的模式,然後添加 @model = Model.find_by_name(params[:id])顯示方法,那麼您可以根據上述獲得的URL。

PS:你應該有領域模式表中您模式

1

我認爲你正在尋找嵌套的路線。請參考以下鏈接http://guides.rubyonrails.org/routing.html#nested-resources

,如果你想通過@Ajay庫馬爾

def to_param 
    name 
end 

其中name是針對特定模型的模型屬性解釋,而不是顯示ID的模型名稱使用to_param方法在模型中。

1

爲什麼不命名空間很大RailsCast

namespace :posts do 
    resources :products 
end 

這應該做我想..

命名空間不包括寧靜的ID添加到範圍..