0

我是 ruby​​ on rails 的初学者,并且正在学习在线教程。我立刻迷路了。每次我尝试访问我的 url 'pages/help' 时,浏览器中都会显示一个错误“找不到 PagesController 的操作 'show' ”。我有一个名为 _header 的 ruby​​ 分区,其中包含以下代码:

<header>
    <%= link_to logo, root_path %>


    <ul class="nav nav-tabs">
      <li class="active">
        <%= link_to "Home |", root_path %>
      </li>

      <li><%= link_to "Help |", pages_help_path %></li>
      <li><%= link_to "Sign In", '#'%></li>
    </ul>
</header>

当我尝试单击“帮助”链接时,会发生错误。

我的 routes.rb 仅包含以下代码:

BakeShop::Application.routes.draw do

  resources :pages
  root :to => 'pages#home'

  #match '/help', :to => 'pages#help'
  get "pages/help"
end

我有一个只有这些代码的 PagesController:

class PagesController < ApplicationController
  def home

  end

  def help

  end
end

当我运行“rake routes”时,包含的列表是:

     pages GET    /pages(.:format)          pages#index
           POST   /pages(.:format)          pages#create
  new_page GET    /pages/new(.:format)      pages#new
 edit_page GET    /pages/:id/edit(.:format) pages#edit
      page GET    /pages/:id(.:format)      pages#show
           PATCH  /pages/:id(.:format)      pages#update
           PUT    /pages/:id(.:format)      pages#update
           DELETE /pages/:id(.:format)      pages#destroy
      root GET    /                         pages#home
pages_help GET    /pages/help(.:format)     pages#help

我当然在我的视图文件夹中创建了 home.html.erb 和 help.html.erb。不同的是,当我在我的视图文件夹中创建一个“show.html.erb”并在我的页面控制器中创建一个名为“show”的操作时,错误消失并链接到 .

所以我要说的是,谁能解释一下?为什么rails寻找我没有定义的“展示”动作而不是“帮助”动作

4

3 回答 3

0

您必须在您的 routes.rb 中启用默认根。

更新 routes.rb:-

BakeShop::Application.routes.draw 做

  资源:页面
  根 :to => 'pages#home'

  #match '/help', :to => 'pages#help'
  获取“页面/帮助”#这不是必需的
匹配 ':controller(/:action(/:id(.:format)))'
结尾
于 2013-08-19T06:18:30.030 回答
0

这里的问题是 show action (page_path) 的路由和 pages_help_path 的路由冲突。如果您只是将该行移到该行get "pages/help"之前,resources :pages它将按您的意愿工作。

路线.rb:

BakeShop::Application.routes.draw do
  get "pages/help"
  resources :pages
  root :to => 'pages#home'
end
于 2013-08-19T06:22:14.203 回答
0

关于 Rails 中的路由要了解的一件事是,指定的路由顺序非常重要。在您的config/routes.rb文件中,您按以下顺序指定了路线:

resources :pages
root :to => 'pages#home'
get "pages/help"

所以,它的作用是匹配resources :pagesfirst 定义的路由。正如您在输出中看到的那样rake routes,Rails 为该特定行生成了以下路由,即resources :pages

     pages GET    /pages(.:format)          pages#index
           POST   /pages(.:format)          pages#create
  new_page GET    /pages/new(.:format)      pages#new
 edit_page GET    /pages/:id/edit(.:format) pages#edit
      page GET    /pages/:id(.:format)      pages#show
           PATCH  /pages/:id(.:format)      pages#update
           PUT    /pages/:id(.:format)      pages#update
           DELETE /pages/:id(.:format)      pages#destroy

另请注意,pages_help GET /pages/help(.:format) pages#help它位于该列表的底部。因此,当您导航到 时/pages/help,Rails 会找到GET与该模式匹配的第一个请求,在这种情况下:

page GET    /pages/:id(.:format)      pages#show

而且由于您没有show定义操作,因此会引发错误“找不到 PagesController 的操作‘显示’”。

show因此,要在不使用and的情况下解决您的特定问题show.html.erb,您可以重新排列config/routes.rb如下:

BakeShop::Application.routes.draw do
  get "pages/help" # Move this line before resources :pages
  resources :pages
  root :to => 'pages#home'
end

移动get "pages/help"将确保对于您的 url,/pages/help此路由将匹配并且您help.html.erb将被渲染。

更新:

它是如何匹配的pages/show

# In the comments below where .format is used think of various extensions just as html, js, json, xml etc but not required.

pages GET    /pages(.:format)          pages#index
# Matches /pages, /pages.format

new_page GET    /pages/new(.:format)      pages#new
# Matches /pages/new, /pages/new.format

edit_page GET    /pages/:id/edit(.:format) pages#edit
# Matches /pages/1/edit, /pages/1/edit.format or pages/anything/edit.format.  Note that the edit in the end is required here,the only variable here is id and format

page GET    /pages/:id(.:format)      pages#show
# Matches /pages/1, /pages/anything, /pages/1.format, /pages/anything.format.  In the question /pages/help matches.
于 2013-08-19T06:23:03.097 回答