2011-10-13 15 views
10

numaralı telefondan farklı bir şeye göre şu anda bir kullanıcı profilini görüntülemek istediğim zaman/users/1/gibi bir şey var. Dunno, bu sorunun ne kadar kolay veya yaygın olduğunu, bu noktada bir Rails noob'unu biraz kullanıyorum, ama nasıl/user/chiggins/chiggins'in benzersiz bir kullanıcı adı olduğunu değiştirmek için routes.rb'den nasıl geçebilirim?Rails Route

Çok teşekkürler! İhtiyacınız

cevap

13

Kullanıcı modelinde yöntemi to_param geçersiz kılmak için geçerli:

class User 
    def to_param 
    username 
    end 
end 

Sonra raylar yönlendirme için automagicallylar kullanacağız.

match "https://stackoverflow.com/users/:username" => "users#show" 
denetleyicinizdeki olarak

, düz eski params [: id] params olacaktır [: kullanıcı adı] en iyi yolu özel bir parametreyle bir rota tanımlamaktır http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

+0

Tamam, bunu biraz ekledim, ancak şu hatayı alıyorum: http://chigstuff.com/uploads/user_error.jpg – Chiggins

+0

Nevermind, sorunumu buldum. Gösteri yöntemim "@ user = User.find (: params [: id])" yapıyordu, kullanıcı adıyla arama yapmak için onu değiştirdim. – Chiggins

+0

Denetleyicinizdeki kodu değiştirin: User.find (params [: id]) değil, User.find_first_by_username (params [: id]) veya to_param'ın gövdesini "# {self.id} - # {self.username}" olarak değiştirin –

0

bakın ve alabilirsiniz kullanarak de DB'den kullanıcı:

User.find_by_username(params[:username]) 
+0

Sadece ilk satırı benim route.db yerine ekledim, bunun yerine kullanıyorum: kullanıcı adı hala kullanılmalıyım: id – Chiggins

1

Sen alabilirsiniz başına kaynak tanımlayıcı cu Kaynak örneğinde member_scope ve nested_scope yöntemlerini yeniden tanımlayarak stomizasyon. Aşağıdaki #nested_scope hakkında soruya gelince

resources :users do 
    @scope[:scope_level_resource].tap do |u| 
    def u.member_scope 
     "#{path}/:username" 
    end 

    def u.nested_scope 
     "#{path}/:#{singular}_username" 
     # member_scope also usable here, assuming username will be nowhere in nested routes. 
    end 
    end 
end 

:

resources :members do 
    resources :playlists, only: :index 
end 

Sonra param olurdu: kullanıcı adı: yerine sadece member_username Eğer yönlendirme böyle bir şey yapmak zaman kullanılır alır. Bu, koleksiyonu birleştirirken oynatma denetleyicide yararlıdır, böylece isteğin kapsamını belirtebilirsiniz.

+0

"# {path} /: kullanıcı adı" anladım, otomatik oluşturulan rotaları overide, ama ben "nested_scope" yönteminin ne anlama geldiğini anladın mı ?! – Matrix

+0

Güncellenmiş answer @Matrix. – 20man