Одно решение было бы сделать два условных маршрутов с следующий код:
map.contact 'contact', :controller => 'messages', :action => 'new', :conditions => { :method => :get }
map.connect 'contact', :controller => 'messages', :action => 'create', :conditions => { :method => :post } # Notice we are using 'connect' here, not 'contact'! See bottom of answer for explanation
Это сделает все получить запрос (прямые запросы и т.д.) использовать «новый» действие, и запрос на почту действие «создать». (Есть два типа запросов: поставить и удалить, но это не имеет значения здесь.)
Теперь, в форме, где вы создаете изменение объекта сообщения
<%= form_for @message do |f| %>
к
<%= form_for @message, :url => contact_url do |f| %>
(Помощник формы автоматически выбирает тип запроса сообщения, потому что это значение по умолчанию при создании новых объектов.)
Должно решить ваши проблемы.
(Это также не приведет к адресной строке мерцать другой адрес. Он никогда не использует другой адрес.)
.
- Объяснение, почему использование подключения не проблема здесь Ссылки map.name_of_route РАЗ ПУТЬ. Поэтому для второго маршрута вам не нужен новый именованный маршрут. Вы можете использовать оригинальный, потому что пути одинаковы. Все остальные параметры используются только тогда, когда новый запрос достигает рельсов, и ему нужно знать, куда его отправить.
.
EDIT
Если вы думаете, что дополнительные маршруты сделать немного беспорядок (особенно если вы используете его чаще) вы можете создать специальный метод для их создания. Этот метод не очень красив (ужасные имена переменных), но он должен выполнять эту работу.
def map.connect_different_actions_to_same_path(path, controller, request_types_with_actions) # Should really change the name...
first = true # There first route should be a named route
request_types_with_actions.each do |request, action|
route_name = first ? path : 'connect'
eval("map.#{route_name} '#{path}', :controller => '#{controller}', :action => '#{action}', :conditions => { :method => :#{request.to_s} }")
first = false
end
end
И затем использовать его как этот
map.connect_different_actions_to_same_path('contact', 'messages', {:get => 'new', :post => 'create'})
Я предпочитаю оригинальный метод, хотя ...
Это блестяще - спасибо! –
Ну, спасибо;) –
Мне нравится это решение, однако рассмотрим map.resources: foo кажется немного ужасным добавить два дополнительных сопоставления маршрута на полностью используемый ресурс (один для нового/создания, один для редактирования/обновления) чтобы вы перенаправлялись в/foo/new и/foo/foo_id/edit при сбое создания/обновления. –