2009-05-01 8 views
12

Ben Rail map.resources tarafından oluşturulan tüm varsayılan yolları gibi. Ancak, rotalarımda sayısal olmayan bir tanımlayıcı kullanmak istediğim durumlar var. yuvalanmış rota kullanıcılar ve onların makaleden oluşur varsa Örneğin, standart bir rota gibi yazılabilir:Rails 'map.resources()' daki varsayılan tanımlayıcı param "id" nasıl yeniden adlandırılır?

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id' 

Ancak, birçok avantaj/nedenleri değil kullanmak Raylar tarafından oluşturulan varsayılan sayısal tanımlayıcı vardır. Varsayılanı değiştirmenin bir yolu var mı? Kimlik paramları, her standart eylem için özel yollar yazmadan, seçimimin başka bir kanonik tanımlayıcısına mı? başarılabilir map.resources kullanarak yollarının bu tür

'/users/:login/articles/:id' 

mi: Ben aşağıdaki biçimde bir rota istiyorsanız Say?

+0

p.s. Bunu soruyorum çünkü Merb'in yönlendirme sistemi bu kapasiteye sahip. – newtonapple

cevap

13

, bu parametre adını değiştirip hala #resources sağlar otomatik yönlendirme kullanmak mümkün değildir. Eğer bir :path_prefix ve :name_prefix ile articles eşleyebilir Çözüm olarak

:

map.resources :articles, :path_prefix => "https://stackoverflow.com/users/:login", 
         :name_prefix => "user_" 

:path_prefix URL'yi etkiler ve bu yolları ile bitireceğiz böylece :name_prefix, oluşturulan adlandırılmış yolları etkiler:

user_articles GET /users/:login/articles(.:format)   {:controller=>"articles", :action=>"index"} 
        POST /users/:login/articles(.:format)   {:controller=>"articles", :action=>"create"} 
new_user_article GET /users/:login/articles/new(.:format)  {:controller=>"articles", :action=>"new"} 
edit_user_article GET /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"} 
    user_article GET /users/:login/articles/:id(.:format)  {:controller=>"articles", :action=>"show"} 
        PUT /users/:login/articles/:id(.:format)  {:controller=>"articles", :action=>"update"} 
        DELETE /users/:login/articles/:id(.:format)  {:controller=>"articles", :action=>"destroy"} 

genel bir kural başparmak gibi olsa da, ben senin soru yayınlanmıştır yönlendirme ile, :user_id Rayları varsayılan kongre ile sopa. Genel olarak, :id ve :user_id'un "sayısal tanımlayıcı" anlamına gelmediği genellikle anlaşılmaktadır - bu, ne olursa olsun "kaynak tanımlayıcısı" anlamına gelir. Ve varsayılan sözleşmeye sadık kalarak, kodunuzun Rails'deki kaynak rotalarını kullanan herkes için daha kolay anlaşılacaktır.

sadece modelinde #to_param yeniden tanımlamak, bir kaynak için bir sayısal olmayan bir tanımlayıcı kullanın. Ardından, denetleyicinizde User#find_by_login! gibi bu tanımlayıcı tarafından (sayısal kimlik yerine) bulunan bir bulucu kullandığınızdan emin olun.

+0

+1: Çok iyi yazılmış bir cevap. –

11

Sen modelinde to_param geçersiz kılarak URL'lerinizdeki kimliği kullanarak varsayılan değiştirebilir. Örneğin.

class User < ActiveRecord::Base 
    def to_param 
    login 
    end 
end 

user_articles_path(@user) => "https://stackoverflow.com/users/:login/articles" 

Yapmanız gereken tek diğer değişiklik, denetleyicilerinizdeki kimliğe değil, kullanıcılara giriş yapmaktır. Raylar 2.3 itibariyle

+0

to_param rota üretimi için denemeyi yapıyor. Ancak tanıma üzerine hala kullanıcı olarak geçer: user_id. Buraya yeniden adlandırmak için var mı: giriş? – newtonapple

+0

Bu farklı bir soruya iyi yazılmış cevabı: id' rota parametreyi: Burada soru yönlendirici ve nasıl 'adlandırmak üzeredir /. – Matchu