1

著者のマイケル・ハートルは次のように述べています。

ここでルール:

get "static_pages/home"

URI /static_pages/home のリクエストを StaticPages コントローラーのホーム アクションにマップします。

どのように?リクエストのタイプと URL は示されていますが、コントローラとアクションへのマッピングはどこにあるのでしょうか。ただし、私のテストはすべて合格します。

また、StaticPagesController のすべてのアクションを削除してみました。これは次のようになります。

class StaticPagesController < ApplicationController
  def home
  end

  def about
  end

  def help
  end

  def contact
  end
end

...そして私のテストはまだパスしますが、これは不可解です。いいえ、次のようにすべてのアクションを削除しました:

class StaticPagesController < ApplicationController
end

本の第 2 版 (オンライン) は本当にイライラします。具体的には、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 はstatic_pages/home、StaticPagesController のホーム アクションを参照していることを URL から推測します。

また、すべてのアクションを「削除」すると、アクション定義が残されます。これがテストでチェックされます。staticpages コントローラーのホーム アクションに移動できるかどうかを確認するだけです。それが存在する限り、それが何もしないかどうかは問題ではありません(少なくともそれはあなたのテストが行​​うと私が思うことです-テストも投稿する気がありますか?)

削除すると

...
def home
end
...

あなたのコントローラーから、私はあなたのテストが失敗すると確信しています

于 2012-08-29T03:32:19.843 に答える
0

私はこの難問に対する答えを見つけました。まず第一に、これはRailsの「問題」であり、rspecの問題ではありません。次のようなroutes.rbにルートを追加した場合:

get "static_pages/dog"

...次にURLを入力します

http://localhost:3000/static_pages/dog 

私のブラウザでは、railsは次のように文句を言います。

不明なアクション

StaticPagesControllerのアクション「dog」が見つかりませんでした

次に、犬のアクションをコントローラーに追加してからビューを作成すると、すべてが正常に機能し、ダンディになります。

しかし、犬のアクションを削除してから、同じURLを使用すると、

http://localhost:3000/static_pages/dog

私のブラウザでは、今回は別の結果が得られます。エラーが表示されるのではなく、ビューに表示されます。

結局のところ、その一貫性のない動作は、デフォルトのレンダリングと呼ばれるRailsの「機能」であり、ここで説明されています。

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

ドキュメントによると、ページをレンダリングするために必要なのはルートとビューだけです。アクションはオプションです。

于 2012-09-02T01:50:47.547 に答える