Указание порядка ресурсов - PullRequest
0 голосов
/ 26 апреля 2011

Я пытаюсь добавить путь к своему приложению. У меня есть код, который работает так, как мне хотелось бы, но я бы хотел сгруппировать его по-другому, чтобы он был более интуитивно понятным для чтения. Вот код:

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

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

resources :posts do

end

но я бы хотел сделать что-то вроде этого:

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

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

Это действительно небольшая разница, но, делая это последним способом, сначала определяются прогоны resources :posts. В результате Rails пытается сопоставить /posts/search с /posts/:id (для показа) и выдает ошибку, так как не может найти сообщение с идентификатором 'search'. Есть ли способ, которым я могу сказать rails запустить определения get и put перед запуском resources :posts?

Ответы [ 2 ]

1 голос
/ 26 апреля 2011
resources :posts do
  collection do
    get :search, :as => :search_posts
    put :search_result, :as => :search_posts_result
  end 
end
1 голос
/ 26 апреля 2011

Причина, по которой ваши маршруты не работают, заключается в том, что они определены для каждого участника сообщений, поэтому /posts/1/posts/search.Вы должны запустить rake routes, чтобы проверить, куда идут ваши маршруты.

Чтобы решить вашу проблему, вы, вероятно, захотите исправить эти маршруты и убедиться, что вы определяете маршрут поиска для всей коллекции.Если это сбивает с толку, проверьте руководство .

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

Вам не нужны все остальные вещи, которые у вас были.Это создаст для вас все следующие маршруты:

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 определяет маршруты во всей коллекции до ресурсовых маршрутов по умолчанию (как вы можете видеть выше), чтобы ваши маршруты имели приоритет.

А что касается вашего PUT posts#search_result метода, это действительно сбивает с толку - вы хотите обновить результат поиска вручную?


Согласно комментариям: Я быпорекомендуйте что-то вроде этого вместо отдельного действия для результатов поиска.Обычно страница поиска выглядит одинаково с результатами или без них, за исключением сообщения об ошибке, если вы выполняете поиск и ничего не появляется.Изящная обработка случая, когда страница поиска отображается без запроса, позволяет исключить избыточное действие.

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

  # search logic

  flash[:error] = 'Nothing found message' if @results.empty? unless @query.blank?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...