使用rails 3.2.1进行路由

时间:2012-02-22 18:31:42

标签: ruby routing ruby-on-rails-3.2

我刚刚将rails 3.0.9应用程序升级到rails 3.2.1,方法是观看railscast以升级到rails 3.1.0然后升级到3.2.0。在更新之前,我的(然后工作)routes.rb文件看起来像:

match "home" => "pages#index"
match "*page" => "pages#show" 
root :to => "pages#index"

更新后,我将routes.rb文件更改为:

match "home" => "pages#index"
match "pages/*page" => "pages#show", :format => false 
root :to => "pages#index"

我在Rout Globbing部分的Ruby on Rails routing得到了这个想法,以模仿rails 3.0.x版。

现在当我点击我的链接时,由:

呈现
<li><%= link_to "What We Do", "/what-we-do" %></li>

我收到此错误:

Routing Error
No route matches [GET] "/what-we-do"
Try running rake routes for more information on available routes.

rake routes produces:

    home  /home(.:format) pages#index
          /pages/*page    pages#show
    root  /               pages#index
If that is helpful.

我尝试渲染的页面名为what-we-do.html.erb,位于app / views / pages。

这是我的控制者:

class PagesController < ApplicationController

  def index
    render :home, :layout => false
  end

  def show
    render static_page 
  rescue 
    # page_not_found
  end


  private

  def static_page
    "#{RAILS_ROOT}/app/views/pages/#{params[:page]}.html.erb"
  end

  def page_not_found
    render "#{Rails.root}/public/404.html", :layout => false 
  end

end

有人有任何建议吗?

4 个答案:

答案 0 :(得分:3)

成员路由需要ID,因为它作用于成员。收集路线不起作用,因为它作用于一组物体。

map.resources :users, :collection => { :customers_list=> :get }

map.resources :users, :member => { :inactive=> :post }

将其视为/users/1;inactive=> [:action => 'inactive', :id => 1]

答案 1 :(得分:2)

您的路线符合/pages/what-we-do

/pages/*page    pages#show

但没有任何内容可以匹配不以/pages/开头的网址(当然除了/home)。你仍然需要你的顶级全球路线:

match "*page" => "pages#show"

如果您想匹配/what-we-do。也许你误解了this from the routing guide

  

从Rails 3.1开始,通配符路由将始终与可选格式段匹配。例如,如果您有此路线:

match '*pages' => 'pages#show'
     

通过请求"/foo/bar.json",您的params[:pages]将等于"foo/bar",请求格式为JSON。

更改是您不必自己处理格式处理,现在可以像处理所有其他路径一样自动处理。

答案 2 :(得分:1)

路线需要像这样 -

match "home", :to => "pages#index"
root :to => "pages#index"
match ":page", :to => "pages#show" 

答案 3 :(得分:0)

好像你没有提到路线中的预期行动。如果您在任何脚手架内使用静态路线,则应在

内的路线中提及该行动
collection :controller do 
  get 'action name'
end