#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?