Routes.rb & rjs

Czesc,

mam w portalu listę użytkowników i adresy były takie:

http://mysite.com/account/show/71

dla pokazania profilu o id=71. Chcę pozbyć się ‘show’, by mieć:

http://mysite.com/account/71

Dodałem następujący wpis w routes.rb:

map.connect 'account/:id', :controller => 'account', :action=>'show'

Efekt osiągnięty, jednak jednocześnie przestały działać linki rjs tworzone poprzez link_to_remote, przykładowo:

<%= link_to_remote "[logout]",  :url=>{:action=>'logout', :controller=>'account'}, :loading=>"Element.show('loginprogress')"%>

Patrząc do loga, jest następujące wywołanie:

Processing AccountController#show (for 90.156.50.212 at 2007-08-23 18:40:06) [POST] Session ID: c5e37a9c286a727f9d2eb6b332056590 Parameters: {"action"=>"show", "id"=>"logout", "controller"=>"account"}
Próbowałem z innymi wpisami w routes.rb, bezskutecznie jednak. Ma ktoś pomysł?

[quote=Animus]map.connect 'account/:id', :controller => 'account', :action=>'show'
Efekt osiągnięty, jednak jednocześnie przestały działać linki rjs tworzone poprzez link_to_remote, przykładowo:

<%= link_to_remote "[logout]",  :url=>{:action=>'logout', :controller=>'account'}, :loading=>"Element.show('loginprogress')"%>

[/quote]
Jest tak dlatego, że definicja ‘account/:id’ pasuje tak samo do ‘/account/71’ jak i ‘/account/logout’ czy ‘/account/dupa’. Dodaj warunki bardziej precyzujące czym jest ów ciąg znaków przypisywany do zmiennej id. Np. jeśli ma tam być tylko liczba, to spróbuj:

map.connect 'account/:id', :controller => 'account', :action => 'show', :requirements => { :id => /^\d+$/ }

Z tym ze rails nie powinno w zaden sposob skojarzyc tutaj :id, skoro on go nie podal, prawda ? A mimo to rails skojarzylo :id i na dodatek ustawilo je na “logout”, natomiast :action ustawilo na ‘show’ pomimo ze wyraznie widac w kodzie :action=>‘logout’. Animus, jakiego rails uzywasz?

Nieprawda. Nie ma czegoś takiego jak :id. Równie dobrze może wpisać :dupa. To jest tylko informacja jaką zmienną tworzyć podczas rozpoznawania URL’a. Generator URL w RJS działa poprawnie. To czy regułę zdefiniujesz jako ‘account/:id’ czy ‘accunt/:fake’ działa identycznie jeśli chodzi o rozpoznawanie URL. W miejsce :id czy :fake można w URL wstawić absolutnie dowolny ciąg znaków. Będzie on wciągnięty do zmiennej params[:id] lub params[:fake]. To jedyna różnica.

Dla config/routes.rb

ActionController::Routing::Routes.draw do |map| map.connect 'account/:id', :controller => 'account', :action => 'show' map.connect ':controller/:action/:id.:format' map.connect ':controller/:action/:id' end
mała sesja w konsoli

irb > rs = ActionController::Routing::Routes 
irb > rs.recognize_path "/account/123"
    ==> {:controller=>"account", :id=>"123", :action=>"show"}

irb > rs.recognize_path "/account/logout"
    ==> {:controller=>"account", :id=>"logout", :action=>"show"}

irb > rs.recognize_path "/account/dupa"
    ==> {:controller=>"account", :id=>"dupa", :action=>"show"}

mam rails 1.2.3. Sposób z requirements zadziałał (dałem tylko innego regexpa). Dzięki!