Une solution serait de faire deux routes conditionnelles avec le code suivant:
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
Cela fera toute requête get (demandes directes, etc.) utiliser l'action « nouveau », et la demande après l'action « créer ». (Il existe deux autres types de demandes: mettre et supprimer, mais ceux-ci ne sont pas pertinentes ici.)
Maintenant, sous la forme où vous créez l'objet de message changement
<%= form_for @message do |f| %>
à
<%= form_for @message, :url => contact_url do |f| %>
(L'assistant de formulaire choisira automatiquement le type de demande de publication, car il s'agit de la valeur par défaut lors de la création de nouveaux objets.)
Pour résoudre vos problèmes.
(Ce ne sera pas aussi provoquer le scintillement de la barre d'adresses autre adresse. Il utilise jamais une autre adresse.)
.
- Explication pourquoi l'utilisation de la connexion est pas un problème ici Les références map.name_of_route JUSTE PATH. Par conséquent, vous n'avez pas besoin d'une nouvelle route nommée pour la deuxième route. Vous pouvez utiliser l'original, car les chemins sont les mêmes. Toutes les autres options sont utilisées uniquement lorsqu'une nouvelle requête atteint les rails et qu'elle doit savoir où l'envoyer.
.
EDIT
Si vous pensez que les routes supplémentaires font un peu de désordre (surtout quand vous utilisez le plus souvent), vous pouvez créer une méthode spéciale pour les créer. Cette méthode n'est pas très belle (noms de variables terribles), mais elle devrait faire l'affaire.
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
Et puis l'utiliser comme ceci
map.connect_different_actions_to_same_path('contact', 'messages', {:get => 'new', :post => 'create'})
Je préfère la méthode originale mais ...
C'est génial - merci! –
J'aime cette solution, cependant, considérons map.resources: foo il semble un peu horrible d'ajouter deux mappages d'itinéraires supplémentaires par ressource pleinement utilisée (une pour new/create, une pour edit/update) pour vous assurer que vous êtes redirigé vers/foo/new et/foo/foo_id/edit en cas d'échec de création/mise à jour –
désolé, pas de redirection .. les actions de publication seraient/foo/new et/foo/foo_id/éditer et ramasser par le routage! –