Problem z routingiem

Witam,
robię prosty serwis w którym będzie możliwe komentowanie zdjęć… Mam obiekt Photo oraz Opinion w relacji 1 do wielu.
Chcialem zastąpić następującą ścieżkę

  map.resources :photos, :has_many => :opinions, :as => 'fotki'

na coś takiego

[code=ruby] map.photo_opinions ‘/fotka/:photo_id/opinie.:format’, :controller => ‘opinions’, :action => ‘index’, :conditions => { :method => :get }
map.connect ‘/fotka/:photo_id/opinie.:format’, :controller => ‘opinions’, :action => ‘create’, :conditions => { :method => :post }
map.new_photo_opinion ‘/fotka/:photo_id/opinie/nowa.:format’,:controller => ‘opinions’, :action => ‘new’, :conditions => { :method => :get }
map.edit_photo_opinion ‘/fotka/:photo_id/opinie/:id/edytuj.:format’, :controller => ‘opinions’, :action => ‘edit’, :conditions => { :method => :get }
map.photo_opinion ‘/fotka/:photo_id/opinie/:id.:format’, :controller => ‘opinions’, :action => ‘show’, :conditions => { :method => :get }
map.connect ‘/fotka/:photo_id/opinie/:id.:format’, :controller => ‘opinions’, :action => ‘update’, :conditions => { :method => :put }
map.connect ‘/fotka/:photo_id/opinie/:id.:format’, :controller => ‘opinions’, :action => ‘destroy’, :conditions => { :method => :delete }

map.photos ‘/fotki.:format’, :controller => ‘photos’, :action => ‘index’, :conditions => { :method => :get }
map.connect ‘/dodaj.:format’, :controller => ‘photos’, :action => ‘create’, :conditions => { :method => :post }
map.new_photo ‘/nowa_fotka.:format’, :controller => ‘photos’, :action => ‘new’, :conditions => { :method => :get }
map.edit_photo ‘/:name/edytuj/:id.:format’, :controller => ‘photos’, :action => ‘edit’, :conditions => { :method => :get }
map.photo ‘/:name/:id.:format’, :controller => ‘photos’, :action => ‘show’, :conditions => { :method => :get }
map.connect ‘/:name/:id.:format’, :controller => ‘photos’, :action => ‘update’, :conditions => { :method => :put }
map.connect ‘/:name/:id.:format’, :controller => ‘photos’, :action => ‘destroy’, :conditions => { :method => :delete }[/code]
w wyniku otrzymałem następujące ścieżki

photo_opinions GET /fotka/:photo_id/opinie(.:format) {:action=>"index", :controller=>"opinions"} POST /fotka/:photo_id/opinie(.:format) {:action=>"create", :controller=>"opinions"} new_photo_opinion GET /fotka/:photo_id/opinie/nowa(.:format) {:action=>"new", :controller=>"opinions"} edit_photo_opinion GET /fotka/:photo_id/opinie/:id/edytuj(.:format) {:action=>"edit", :controller=>"opinions"} photo_opinion GET /fotka/:photo_id/opinie/:id(.:format) {:action=>"show", :controller=>"opinions"} PUT /fotka/:photo_id/opinie/:id(.:format) {:action=>"update", :controller=>"opinions"} DELETE /fotka/:photo_id/opinie/:id(.:format) {:action=>"destroy", :controller=>"opinions"} photos GET /fotki(.:format) {:action=>"index", :controller=>"photos"} POST /dodaj(.:format) {:action=>"create", :controller=>"photos"} new_photo GET /nowa_fotka(.:format) {:action=>"new", :controller=>"photos"} edit_photo GET /:name/edytuj/:id(.:format) {:action=>"edit", :controller=>"photos"} photo GET /:name/:id {:action=>"show", :controller=>"photos"} PUT /:name/:id(.:format) {:action=>"update", :controller=>"photos"} DELETE /:name/:id(.:format) {:action=>"destroy", :controller=>"photos"}
Niestety zmiana spowodowała, iż podczas dodawania nowej fotografii leci ActionController::MethodNotAllowed - Only get, put, and delete requests are allowed.
Wiecie może czym to jest podyktowane?

tylko czemu chcesz całkiem sensowny routing zamienić na takiego potwora?

chociażby dla celów czysto edukacyjnych :).
Zamiast nic nie mówiącej struktury w której na pierwszym miejscu jest nazwa tudzież alias kontrolera
jakiesfotki.pl/fotki/1
chciałbym mieć
jakiesfotki.pl/bezchmurne-niebo/1
jakiesfotki.pl/morze-noca/1

Coś takiego chcesz, jest też do tego jakiś plugin czy gem. Nie pamiętam nazwy, ale na pewno ci ktoś pomoże ;]

http://garrickvanburen.com/archive/using-names-in-rails-routes-instead-of-ids

Zamiast się męczyć warto poczytać dokumentację. :slight_smile: Np. tutaj: Translated Paths

edit: Ups, zdaje się, że to załatwia tylko pierwszą połowę pytania, i w dodatku tylko dla Rails 3.

tak dla informacji: korzystam z rails 2.3.10 :slight_smile:
Wydaje mi się że to dość proste i typowe użycie… niestety google niewiele mi pomogło

Tu masz wszytskie odpowiedzi, jak nie pomógł poprzedni mój link

http://guides.rubyonrails.org/v2.3.8/routing.html

@gotar: jak Twój link miał mi pomóc skoro jest nie do końca na temat. Jak zauważyłeś, albo i nie, mój problem dotyczy tworzenia nowego obiektu.
Ma ktoś pomysł?

ps.
wiem gdzie znaleźć dokumentację

weszka, czy próbowałeś tak?

map.with_options :path_names => {:new => 'nowa', :edit => 'edytuj'} do |app| app.resources :photos, :as => "fotki", :except => [:show, :edit, :update, :destroy] do |photo| photo.resouces :opinions, :as => "opinie" end end
To wygeneruje wszystkie helpery, oprócz ostatnich 4 z nazwą zdjęcia. Idąc dalej, powiedzmy, że to już masz dobrze napisane:

map.edit_photo '/:name/edytuj/:id.:format', :controller => 'photos', :action => 'edit', :conditions => { :method => :get } map.photo '/:name/:id.:format', :controller => 'photos', :action => 'show', :conditions => { :method => :get } map.connect '/:name/:id.:format', :controller => 'photos', :action => 'update', :conditions => { :method => :put } map.connect '/:name/:id.:format', :controller => 'photos', :action => 'destroy', :conditions => { :method => :delete }
Działa?

Dzięki za pomoc, @hekto5 ostatecznie nie skorzystałem z Twojego rozwiązania ale w wolnej chwili sprawdzę i dam odpowiedź czy działa - ciekawe podejście.
Okazało się że kiedy nie korzysta się z resourców to generowana jest błędna ścieżka w formie. Zamiast /nowa_fotka było /fotki.
Aby rozwikłać ten problem musiałem zmienić

map.connect      '/dodaj.:format', :controller => 'photos', :action => 'create', :conditions => {:method => :post}

na

map.create_photo '/dodaj.:format', :controller => 'photos', :action => 'create', :conditions => {:method => :post}

<% form_for( @photo, :url => create_photo_path ) %> ... <% end %>
To również nie do końca mi się podobało, gdyż w przypadku gdy walidacja nie przebiegła pomyślnie, była zmieniana ścieżka na /fotki. Dlatego musiałem jeszcze delikatnie przerobić routing (znalazłem to na http://michalorman.pl/blog/2010/03/zmieniajacy-sie-url-po-bledach-walidacji-w-rails/):

map.connect '/nowa_fotka.:format', :controller => 'photos', :action => 'create', :conditions => {:method => :post} map.new_photo '/nowa_fotka.:format', :controller => 'photos', :action => 'new', :conditions => {:method => :get}

<% form_for( @photo, :url => new_photo_path ) %> ... <% end %>
Jeszcze raz wielkie dzięki, pozdrawiam :slight_smile:

no jak dla mnie wystarczylo chyba uzyc :prefix, :as … no ale najwazniejsze ze dziala

owszem… prefiks :as można użyć, ale wówczas ścieżki nadal będą wyglądały tak: mojastrona.pl/fotki/2, a nie mojastrona.pl/fotografia-nieba/2 bądź mojastrona.pl/2