我刚刚将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
有人有任何建议吗?
答案 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