Custom Rails 3 маршрута - PullRequest
       7

Custom Rails 3 маршрута

1 голос
/ 03 апреля 2012

Предположим, у меня есть events контроллер.Если я запрашиваю /events по GET, он ответит действием index в контроллере новостей, в этом представлении будут отображаться будущие события.

Я хочу добавить новое действие с именем past, это похоже наindex, которые возвращают массив Event с, но с другим запросом.

Я добавил к routes.rb этот фрагмент:

resources :events do
  collection do
    get :past
  end
end

, а этот - к events_controller:

def history
  @events => Event.past
  render :template => 'index'
end

Но когда я запрашиваю http://127.0.0.1:3000/events/past, в браузере это не работает, в журнале выкидываются следующие строки:

Started GET "/events/past" for 127.0.0.1 at 2012-04-02 19:32:01 -0500
  Processing by EventsController#show as HTML
  Parameters: {"id"=>"past"}

И, наконец, у вас есть rake routes вывод:

            events GET    /events(.:format)                  {:action=>"index", :controller=>"events"}
             event GET    /events/:id(.:format)              {:action=>"show", :controller=>"events"}
       past_events GET    /events/past(.:format)             {:action=>"past", :controller=>"events"}
  contact_us_event POST   /events/:id/contact_us(.:format)   {:action=>"contact_us", :controller=>"events"}
                   GET    /events(.:format)                  {:action=>"index", :controller=>"events"}
                   POST   /events(.:format)                  {:action=>"create", :controller=>"events"}
         new_event GET    /events/new(.:format)              {:action=>"new", :controller=>"events"}
        edit_event GET    /events/:id/edit(.:format)         {:action=>"edit", :controller=>"events"}
                   GET    /events/:id(.:format)              {:action=>"show", :controller=>"events"}
                   PUT    /events/:id(.:format)              {:action=>"update", :controller=>"events"}
                   DELETE /events/:id(.:format)              {:action=>"destroy", :controller=>"events"}

Другой тест - проверка маршрутов с помощью консоли Rails:

$ script/rails c
1.9.2-p318 :001 > rs = ActionController::Routing::Routes
1.9.2-p318 :002 > rs.recognize_path "/events/past", :method => :get
 => {:action=>"show", :controller=>"events", :id=>"past"} 

Что не так?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2012

Проблема была в приоритете маршрутов, здесь у вас есть блок routes.rb, который работает:

resources :events, :only => [:index, :show] do
  get 'past', :on => :collection
  post 'contact_us', :on => :member
end
0 голосов
/ 03 апреля 2012

Попробуйте:

resources :events do
  get :past, :to => "events#past"
end

Не думаю, что вам нужен контекст коллекции.(И вам может не понадобиться: to part)

Обновление

Другой способ сделать это - поместить вызов события над ресурсом.Предполагая, что вам не нужна коллекция с ним.

get 'events/past', :to => "events#past"
resources :events

Должны предоставить вам правильные маршруты.

Для справки: Маршруты Rails 3: Как избежать конфликта с 'показать 'действие?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...