Rails 3.1中的路由路径

时间:2011-10-21 21:04:23

标签: routing ruby-on-rails-3.1

我在Rails 3.1中遇到以下错误:

#<#:0x71152b0>

的未定义局部变量或方法`sitemap_home_path'

错误来自以下行:

看起来我错误地定义了我的路线。我routes.rb这条路线的定义如下:

root :to => 'home#index'

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

所以,我希望我的网址为http://localhost:3000/home/sitemap,其中sitemap是views / home下的sitemap.html.erb文件。有人可以向我解释为什么在这种情况下不会创建sitemap_home_path吗?

使用以下Rails 2.1声明工作正常:

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

2 个答案:

答案 0 :(得分:2)

要获得所需的url_path,即sitemap_home_path,您的routes.rb应如下所示:

resource :home
  collection do
    get :sitemap
  end
end

原因是home是一个总是在没有ID的情况下查找的资源。因此,在这种情况下,您应该使用单一资源。一般来说,请参阅http://guides.rubyonrails.org/routing.html#singular-resources和导轨指南,因为有关路由的文章非常全面。

答案 1 :(得分:0)

运行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 %>