Хорошо, я относительно новичок в rails и работаю над книгой Rails для PHP-программистов.Чтобы было интересно, я использую Rails 3 и haml для работы с книгой, а книга написана с использованием Rails 2.X и erb, поэтому некоторые примеры устарели.
К вопросу: маршрутПримером в книге является
map.presentation 'meetings/:meeting_id/presentations/:action/:id',
:controller => "presentations",
:action => "show",
:meeting_id => /\d+/
Так что это был маршрут до Rails 3.Моя адаптация вышеупомянутого в маршрут Rails 3:
match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations#show', :constraints => {:id => /\d/}
Моя адаптация работает для действия уничтожения, но не для действия редактирования ... и из-за моей неопытности я не знаю, что яя делаю неправильноИз статьи здесь (http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/) похоже, что я все делаю правильно, но что-то не так.
link_to
Помощники, которые создают URL-адреса, выглядят следующим образом
= link_to 'edit', :controller => 'presentations',
:action => 'edit',
:meeting_id => presentation.meeting.id,
:id => presentation.id
# Incorrectly Produces: http://localhost:3000/presentations/edit?meeting_id=2&id=1
= link_to 'destroy', { :controller => 'presentations',
:action => 'destroy',
:meeting_id => presentation.meeting.id,
:id => presentation.id },
:confirm => 'Are you sure?',
:method => :delete
# Correctly Produces: http://localhost:3000/meetings/2/presentations/destroy/1
Ваша помощь поможет мне избавиться от проблем с маршрутизацией. Большое спасибо!
РЕДАКТИРОВАТЬ
Вот файл нерабочего маршрута.в целом:
UserGroup::Application.routes.draw do
get "presentations/new"
get "presentations/edit"
get "sessions/new"
get "users/index"
get "users/show"
get "users/new"
get "users/edit"
get "meetings/index"
match '/meetings/show/:id', :to => 'meetings#show', :as => 'meeting'
match '/meetings/new', :to => 'meetings#new', :as => 'new_meeting'
match '/meetings/edit/:id', :to => 'meetings#edit', :as => 'edit_meeting'
match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations', :constraints => {:id => /\d/}
#default route
match ':controller(/:action(/:id(.:format)))'
end
РЕДАКТИРОВАТЬ 2
Благодаря codykrieger я взглянул на остальную часть файла маршрутов (я знаю, да, верно?). Видимо,все эти маршруты "..." добавляются при использовании генератора rails и помогают установить некоторые соединения по умолчанию в приложении. Я закомментировал строку get "presentations/edit"
и, удивительно, моя адаптация к маршрутизации действительно работает.
Это работает:
UserGroup::Application.routes.draw do
get "presentations/new"
#get "presentations/edit"
get "sessions/new"
get "users/index"
get "users/show"
get "users/new"
get "users/edit"
get "meetings/index"
match '/meetings/show/:id', :to => 'meetings#show', :as => 'meeting'
match '/meetings/new', :to => 'meetings#new', :as => 'new_meeting'
match '/meetings/edit/:id', :to => 'meetings#edit', :as => 'edit_meeting'
match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations', :constraints => {:id => /\d/}
#default route
match ':controller(/:action(/:id(.:format)))'
end
Я поигрался с порядком маршрутов в файле и также обнаружил, что если я поставлю свой маршрут над всеми автоматически сгенерированными маршрутами, не комментируя get "presentations/edit"
, мой маршрут все еще имеет ожидаемый эффект.
ЭтоТакже работает:
UserGroup::Application.routes.draw do
match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations', :constraints => {:id => /\d/}
get "presentations/new"
get "presentations/edit"
get "sessions/new"
get "users/index"
get "users/show"
get "users/new"
get "users/edit"
get "meetings/index"
match '/meetings/show/:id', :to => 'meetings#show', :as => 'meeting'
match '/meetings/new', :to => 'meetings#new', :as => 'new_meeting'
match '/meetings/edit/:id', :to => 'meetings#edit', :as => 'edit_meeting'
#default route
match ':controller(/:action(/:id(.:format)))'
end
Я думаю, что последний способ лучше, и я должен сделать свои собственные объявления маршрутизации выше стандартных сгенерированных, но я не уверен.Если кто-то хочет прокомментировать, какая практика лучше, или если лучше полностью удалить сгенерированные, если я хочу указать свою собственную, я хотел бы услышать это.
Спасибо всем:)