2011-04-25 8 views
0

J'essaie d'ajouter un chemin à mon application. J'ai un code qui fonctionne comme je le voudrais, mais j'aimerais le regrouper différemment pour qu'il soit plus intuitif à lire. Voici le code:Spécification de l'ordre des ressources

get 'posts/search' => 'posts#search', 
    :as => :search_posts 

put 'posts/search_result' => 'posts#search_result', 
    :as => :search_posts_result 

resources :posts do 

end 

mais je voudrais faire quelque chose comme ceci:

resources :posts do 
    get 'posts/search' => 'posts#search', 
    :as => :search_posts 

    put 'posts/search_result' => 'posts#search_result', 
    :as => :search_posts_result 
end 

Il est une différence très petite, mais le faire la dernière façon définit fonctionne resources :posts premier. Par conséquent, Rails tente de faire correspondre /posts/search à /posts/:id (pour l'affichage) et donne une erreur car il ne peut pas trouver un message avec l'ID 'recherche'. Y at-il un moyen que je peux dire à rails pour exécuter les définitions get et mettre avant d'exécuter resources :posts?

Répondre

1

La raison pour laquelle vos itinéraires ne fonctionnent pas est qu'ils sont définis sur chaque membre des messages, donc /posts/1/posts/search. Vous devez exécuter rake routes pour vérifier où vont vos itinéraires. Pour résoudre votre problème, vous voudrez probablement corriger ces chemins d'accès et vous assurer que vous définissez le chemin de recherche sur l'ensemble de la collection. Si cela est déroutant, vérifiez le guide.

resources :posts do 
    get :search, :on => :collection 
end 

Vous n'avez pas non plus besoin de toutes les autres choses que vous aviez. Cela va créer toutes les routes suivantes pour vous:

search_posts GET /posts/search(.:format) {:action=>"search", :controller=>"posts"} 
     posts GET /posts(.:format)   {:action=>"index", :controller=>"posts"} 
      POST /posts(.:format)   {:action=>"create", :controller=>"posts"} 
    new_post GET /posts/new(.:format)  {:action=>"new", :controller=>"posts"} 
    edit_post GET /posts/:id/edit(.:format) {:action=>"edit", :controller=>"posts"} 
     post GET /posts/:id(.:format)  {:action=>"show", :controller=>"posts"} 
      PUT /posts/:id(.:format)  {:action=>"update", :controller=>"posts"} 
      DELETE /posts/:id(.:format)  {:action=>"destroy", :controller=>"posts"} 

Rails définit les routes sur toute la collection avant que les routes de ressources par défaut (comme vous pouvez le voir ci-dessus) afin que vos itinéraires ont priorité.

Et aussi loin que votre méthode PUT posts#search_result, eh bien, c'est vraiment déroutant - vous voulez mettre à jour un résultat de recherche manuellement?


par les commentaires: je recommande quelque chose comme ça au lieu d'avoir une action distincte pour les résultats de recherche. En règle générale, une page de recherche semble la même avec ou sans résultats, sauf le message d'erreur si vous effectuez une recherche et que rien ne s'affiche. Traiter avec élégance le cas où une page de recherche est affichée sans qu'une requête soit présente vous permet de nix une action redondante.

def search 
    @query == params[:q] || '' 

    # search logic 

    flash[:error] = 'Nothing found message' if @results.empty? unless @query.blank? 
end 
+0

Vous avez raison sur l'utilisation 'PUT messages # search_result'. J'ai réalisé après avoir écrit ceci que ça devrait être un "GET". Merci pour la réponse réfléchie. Votre réponse et votre dinatih ont tous deux fonctionné, mais je vous donne celui-ci pour la description supplémentaire. –

+0

@Eric Hu: Merci pour l'acceptation. Colorie-moi stupide, mais un résultat de recherche pour/posts/search ne devrait-il pas être un message en soi, pas un type distinct? En d'autres termes, le lien pour chaque résultat de recherche ne devrait-il pas être un/post/id? – coreyward

+0

Merci pour la réponse! Comme je l'ai prévu, 'posts # search_results' (j'ai ajouté un s dans mon code) est comme' posts # index', mais ne liste que les messages pertinents aux paramètres de recherche de l'utilisateur entrés dans 'posts # search'. Pour le moment, il utilise en fait la vue 'posts # index', mais je prévois de faire une vue séparée pour' posts # search_results' afin que cela puisse être fait avec AJAX. Cela a-t-il du sens? –

1
resources :posts do 
    collection do 
    get :search, :as => :search_posts 
    put :search_result, :as => :search_posts_result 
    end 
end 
+0

Ah, cela a fonctionné. Merci! J'ai essayé de le faire plus tôt mais j'ai oublié de changer 'posts/search' pour juste 'search'. –

+0

;), Alors pouvez-vous valider ma réponse s'il vous plaît. – Dinatih

+0

: P J'ai eu du mal à choisir entre votre réponse et coreyward, car ils fonctionnent tous les deux. Le vôtre était 2 minutes plus tôt mais j'ai senti que son poste expliquait un peu plus. Je vous ai donné un upvote en remerciement pour votre réponse si. Désolé, je les marquerais tous les deux correctement si je pouvais! –

Questions connexes