2016-10-25 3 views
1

Je développe l'application de rails et a rencontré un tel problème.Rails itinéraires config pense que la méthode d'action est un ID d'objet

J'ai movies_controller.rb, où j'ai ces actions et les itinéraires définis:

  Prefix Verb URI Pattern     Controller#Action 
      movies GET /movies(.:format)    movies#index 
        POST /movies(.:format)    movies#create 
     new_movie GET /movies/new(.:format)   movies#new 
     edit_movie GET /movies/:id/edit(.:format) movies#edit 
      movie GET /movies/:id(.:format)   movies#show 
        PATCH /movies/:id(.:format)   movies#update 
        PUT /movies/:id(.:format)   movies#update 
        DELETE /movies/:id(.:format)   movies#destroy 
       root GET /       redirect(301, /movies) 
movies_by_director GET /movies/by_director(.:format) movies#by_director 

Mais quand je tente d'aller à /movies/by_director?director="something", rails pense, que je navigation à movies#show action paramètre :id = by_director.

Qu'est-ce que je fais mal?

Répondre

2

Les routes sont mises en correspondance dans l'ordre où elles sont spécifiées. Assurez-vous que l'itinéraire de "by_director" est défini au-dessus de les itinéraires de ressources pour les films.

Quelque chose comme ça devrait faire l'affaire:

get '/movies/by_director' => 'movies#by_director' 
resources :movies 
+0

Il fait en acte. :) Merci! –

1

Il y a deux problèmes dans un ici:

  1. Le modèle par défaut correspondant pour :id est assez lâche que by_director est interprété comme un :id.
  2. Les routes sont appariées dans l'ordre et GET /movies/:id apparaît avant GET /movies/by_director.

Vous pouvez définir manuellement GET /movies/by_director avant resources :movie que infused suggests ou vous pouvez ajouter une contrainte pour réduire ce :id s ressemblent:

resources :movies, constraints: { id: /\d+/ } do 
    #... 
end 

commande manuellement les routes est très bien s'il y a juste un ou deux pour les traiter, la contrainte :id est (IMO) plus propre et moins sujet aux erreurs.