1

作者迈克尔·哈特尔说:

这里的规则:

get "static_pages/home"

将对 URI /static_pages/home 的请求映射到 StaticPages 控制器中的 home 操作。

如何?给出了请求的类型,给出了 url,但是控制器和动作的映射在哪里呢?不过,我的测试都通过了。

我还尝试删除 StaticPagesController 中的所有操作,如下所示:

class StaticPagesController < ApplicationController
  def home
  end

  def about
  end

  def help
  end

  def contact
  end
end

...而且我的测试仍然通过,这令人费解。不,我删除了所有这样的操作:

class StaticPagesController < ApplicationController
end

这本书的第二版(在线)真的很令人沮丧。具体来说,无法遵循有关更改 Guardfile 的部分。例如,如果我指示您编辑此文件:

blah blah blah
dog dog dog
beetle beetle beetle
jump jump jump

并进行以下更改:

blah blah blah
.
.
.
go go go
.
.
.
jump jump jump

...您知道代码中的“go go go”行应该在哪里吗?

练习 3.5-1 的提示完全错误。如果作者在每章的末尾都放置评论部分,那么 Rails 社区就可以自行编辑这本书。

测试:

require 'spec_helper'

describe "StaticPages" do
  let(:base_title) { "Ruby on Rails Tutorial Sample App" }

  describe "Home page" do
    it "should have the h1 'Sample App'" do
      visit '/static_pages/home'
      page.should have_selector('h1', :text => 'Sample App')
    end

    it "should have the title 'Home'" do
      visit "/static_pages/home"
      page.should have_selector(
            'title', 
            :text => "#{base_title} | Home")
    end

  end

  describe 'Help page' do
    it "should have the h1 'Help'" do
      visit "/static_pages/help"
      page.should have_selector('h1', :text => 'Help')
    end

    it "should have the title 'Help'" do
      visit '/static_pages/help'
      page.should have_selector(
            'title',
            :text => "#{base_title} | Help")
    end

  end

  describe 'About page' do
    it "should have the h1 'About'" do
      visit '/static_pages/about'
      page.should have_selector('h1', :text => 'About')
    end

    it "should have the title 'About'" do
      visit '/static_pages/about' 
      page.should have_selector(
            'title',
            :text => "#{base_title} | About")
    end
  end

  describe 'Contact page' do
    it "should have the h1 'Contact'" do
      visit '/static_pages/contact'
      page.should have_selector('h1', :text => 'Contact')
    end

    it "should have the title 'Contact'" do
      visit '/static_pages/contact'
      page.should have_selector(
            'title', 
            :text => "#{base_title} | Contact")
    end
  end

end
4

2 回答 2

1

正如你在这里看到的:

http://guides.rubyonrails.org/routing.html#http-verb-constraints

它只是一个简写

match 'static_pages/home' => 'static_pages#home', :via => :get

基本上,Rails 从您的 url 推断出您static_pages/home指的是 StaticPagesController 的 home 动作。

此外,当您“删除”所有操作时,您留​​下了操作定义 - 这是测试检查的内容。它只是检查它是否可以转到您的静态页面控制器的主页操作。只要它存在,它是否不做任何事情都没有关系(至少我认为你的测试是这样做的——也关心发布测试吗?)

如果你删除

...
def home
end
...

从你的控制器,我很确定你的测试会失败

于 2012-08-29T03:32:19.843 回答
0

我找到了这个难题的答案。首先,这是一个轨道“问题”而不是 rspec 问题;如果我向 routes.rb 添加路由,例如:

get "static_pages/dog"

...然后输入网址

http://localhost:3000/static_pages/dog 

在我的浏览器中,rails 抱怨:

未知动作

找不到 StaticPagesController 的动作“狗”

然后,如果我将狗动作添加到控制器,然后创建一个视图,一切正常且花花公子。

但是如果我然后删除狗动作,然后使用相同的网址,

http://localhost:3000/static_pages/dog

在我的浏览器中,这次我得到了不同的结果——而不是视图显示的错误。

事实证明,这种不一致的行为是称为默认渲染的 rails '功能',解释如下:

http://guides.rubyonrails.org/layouts_and_rendering.html#rendering-by-default-convention-over-configuration-in-action

According to the docs, all that's needed to render a page is a route and a view--the action is optional.

于 2012-09-02T01:50:47.547 回答