Путь маршрутизации в Rails 3.1

#routing #ruby-on-rails-3.1

#маршруты #ruby-on-rails-3.1

Вопрос:

Я получаю следующую ошибку в Rails 3.1:

неопределенная локальная переменная или метод `sitemap_home_path’ для #<#:0x71152b0>

Ошибка исходит из строки:

Похоже, я неправильно определил свой маршрут. I routes.rb этот маршрут определяется следующим образом:

 root :to => 'home#index'

resources :home do
  collection do
    .....
    get :sitemap
    .....
  end
end
  

Итак, я ожидаю, что мой URL-адрес будет http://localhost:3000/home/sitemap где карта сайта — это файл sitemap.html.erb в разделе views/home. Может ли кто-нибудь объяснить мне, почему в этом случае sitemap_home_path не создается?

Он отлично работал со следующим объявлением Rails 2.1:

  resources :home, :collection => {...., :sitemap => :get }
  

Ответ №1:

Чтобы получить желаемый url_path, т.е. sitemap_home_path, ваш routes.rb должен быть таким:

 resource :home
  collection do
    get :sitemap
  end
end
  

Причина этого в том, что home — это ресурс, который всегда просматривается без идентификатора. Поэтому в этом случае вам следует использовать отдельный ресурс. Пожалуйста, обратитесь к http://guides.rubyonrails.org/routing.html#singular-resources и направляющие рельсы в целом, так как статья о маршрутизации довольно всеобъемлющая.

Комментарии:

1. Большое спасибо, Ширджил! Это было именно то, что я искал. Я прочитал этот документ, но я не понял, что помимо «ресурсов» существует ключевое слово «ресурс».

Ответ №2:

Запуск rake routes — отличный способ узнать, какие Rails называют ваши маршруты. В вашем коде вы, вероятно, увидите что-то похожее на это:

 sitemap_home_index GET    /home/sitemap(.:format)  {:action=>"sitemap", :controller=>"home"}
        home_index GET    /home(.:format)          {:action=>"index", :controller=>"home"}
                   POST   /home(.:format)          {:action=>"create", :controller=>"home"}
          new_home GET    /home/new(.:format)      {:action=>"new", :controller=>"home"}
         edit_home GET    /home/:id/edit(.:format) {:action=>"edit", :controller=>"home"}
              home GET    /home/:id(.:format)      {:action=>"show", :controller=>"home"}
                   PUT    /home/:id(.:format)      {:action=>"update", :controller=>"home"}
                   DELETE /home/:id(.:format)      {:action=>"destroy", :controller=>"home"}
  

Итак, вы хотите использовать <%= link_to 'Sitemap', sitemap_home_index_path %> .

Комментарии:

1. Привет, Дилан! Большое спасибо за совет. Я совершенно забыл об этой команде. Теперь все ясно. Но я все еще не могу привести путь к правильному формату. Не могли бы вы сказать мне, пожалуйста, как я могу избавиться от _index части sitemap_home_index_path?