ruby on rails教程错误第9章

时间:2013-08-12 01:06:09

标签: ruby-on-rails railstutorial.org

我一直在研究ruby on rails教程。我对这些东西全新。我在第9章并完全陷入困境。我希望有人可以帮我解密错误信息。到目前为止,我刚刚搜索过它们并将其弄清楚,但我认为了解如何破译错误消息以解决问题会更有价值。如果解释的时间太长或太麻烦,而不是我完全理解,如果没有人想要接受它。我无法找到在线帮助我自己的东西。

以下是我目前遇到的错误

1)在登录后尝试访问受保护页面时,AuthenticationPages会为非登录用户签署有效信息授权,以呈现所需的受保护页面

 Failure/Error: click_button "Sign in"
 Capybara::ElementNotFound:
   Unable to find button "Sign in"
 # ./spec/requests/authentication_pages_spec.rb:61:in `block (7 levels) in <top (required)>'

2)AuthenticationPages使用访问编辑页面的Users控制器中的非登录用户的有效信息授权登录

 Failure/Error: it { should have_title('Sign in') }
   expected #has_title?("Sign in") to return true, got false
 # ./spec/requests/authentication_pages_spec.rb:76:in `block (8 levels) in <top (required)>'

3)AuthenticationPages使用有效的信息授权登录用户控制器中的非登录用户,因为用户访问用户#edit页面错误

 Failure/Error: before { sign_in user, no_capybara: true }
 NoMethodError:
   undefined method `sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_2::Nested_2::Nested_2::Nested_1::Nested_2::Nested_3::Nested_1:0xabbb9e4>
 # ./spec/requests/authentication_pages_spec.rb:87:in `block (8 levels) in <top (required)>'

4)AuthenticationPages使用有效的信息授权为Users控制器中的非登录用户登录,因为错误的用户向User#update action提交了PATCH请求

 Failure/Error: before { sign_in user, no_capybara: true }
 NoMethodError:
   undefined method `sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_2::Nested_2::Nested_2::Nested_1::Nested_2::Nested_3::Nested_2:0xa82d354>
 # ./spec/requests/authentication_pages_spec.rb:87:in `block (8 levels) in <top (required)>'

在6.6秒内完成 65个例子,4个失败

失败的例子:

  

rspec ./spec/requests/authentication_pages_spec.rb:66#   AuthenticationPages使用有效的信息授权登录   尝试访问受保护页面后的非登录用户   登录应呈现所需的受保护页面

     

rspec ./spec/requests/authentication_pages_spec.rb:76#   AuthenticationPages使用有效的信息授权登录   访问编辑页面的Users控制器中的非登录用户

     

rspec ./spec/requests/authentication_pages_spec.rb:91#   AuthenticationPages使用有效的信息授权登录   用户控制器中的非登录用户作为错误的用户访问   用户#编辑页面

     

rspec ./spec/requests/authentication_pages_spec.rb:96#   AuthenticationPages使用有效的信息授权登录   作为错误用户提交的用户控制器中的非登录用户   PATCH请求用户#更新操作

authentication_pages_spec.rb

require 'spec_helper'

describe "AuthenticationPages" do


subject { page }


describe "signin page" do
    before { visit signin_path }

    it { should have_content('Sign in') }
    it { should have_title('Sign in') }
end

describe "signin" do
    before { visit signin_path }

    describe "with invalid information" do
        before { click_button "Sign in" }

        it { should have_title('Sign in') }
        it { should have_selector('div.alert.alert-error', text: 'Invalid') }

        describe "after visiting another page" do
            before { click_link "Home" }
            it { should_not have_selector('div.alert.alert-error', text: 'Invalid') }
        end
    end

    describe "with valid information" do
        let(:user) { FactoryGirl.create(:user) }

        before do
            fill_in "Email",     with: user.email.upcase
            fill_in "Password",  with: user.password
            click_button "Sign in"
        end

        it { should have_title(user.name) }
        it { should have_link('Profile',     href: user_path(user)) }
        it { should have_link('Settings',    href: edit_user_path(user)) }
        it { should have_link('Sign out',    href: signout_path) }
        it { should_not have_link('Sign in', href: signin_path) }

        describe "followed by signout" do
            before { click_link "Sign out" }
            it { should have_link('Sign in') }
        end

        describe "authorization" do

            describe "for non-signed-in users" do
                let(:user) { FactoryGirl.create(:user) }

                describe "when attempting to visit a protected page" do
                    before do
                        visit edit_user_path(user)
                        fill_in "Email",    with: user.email
                        fill_in "Password", with: user.password
                        click_button "Sign in"
                    end

                    describe "after signing in" do

                        it "should render the desired protected page" do
                            expect(page).to have_title('Edit user')
                        end
                    end
                end

                describe "in the Users controller" do

                    describe "visiting the edit page" do
                        before { visit edit_user_path(user) }
                        it { should have_title('Sign in') }
                    end

                    describe "submitting to the update action" do
                        before { patch user_path(user) }
                        specify { expect(response).to redirect_to(signin_path) }
                    end

                    describe "as wrong user" do
                        let(:user) { FactoryGirl.create(:user) }
                        let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
                        before { sign_in user, no_capybara: true }

                        describe "visiting Users#edit page" do
                            before { visit edit_user_path(wrong_user) }
                            it { should_not have_title(full_title('Edit user')) }
                        end

                        describe "submitting a PATCH request to the User#update action" do
                            before { patch user_path(wrong_user) }
                            specify { expect(response).to redirect_to(root_url) }
                        end
                    end
                end
            end
        end
    end
  end
 end

user_pages_spec.rb

      require 'spec_helper'

 describe "User pages" do

subject { page }

describe "signup page" do
before { visit signup_path }

it { should have_content('Sign up') }
 it { should have_title(full_title('Sign up')) }
end

describe "signup" do

before { visit signup_path }

let(:submit) { "Create my account" }

describe "with invalid information" do
  it "should not create a user" do
    expect { click_button submit }.not_to change(User, :count)
  end

  describe "after submission" do
    before { click_button submit }
    it { should have_title('Sign up') }
    it { should have_content('error') }
  end


  describe "with valid information" do
    before do
      fill_in "Name",  with: "Example User"
      fill_in "Email",with: "user@example.com"
      fill_in "Password",  with: "foobar"
      fill_in "Confirmation", with: "foobar"
    end

    it "should create a new user" do
      expect { click_button submit }.to change(User, :count).by(1)
    end

    describe "after saving the user" do
      before { click_button submit }
      let(:user) { User.find_by(email: 'user@example.com') }

      it { should have_title(user.name) }
      it { should have_selector('div.alert.alert-success', text: 'Welcome') }
    end

    it "should create a user" do
      expect { click_button submit }.to change(User, :count).by(1)
    end

    describe "edit" do
      let(:user) {FactoryGirl.create(:user) }
      before do
        sign_in user
        visit edit_user_path(user)
      end

      describe "page" do
        it { should have_content("Update your profile") }
        it { should have_title("Edit user") }
        it { should have_link('change', href: 'http://gravatar.com/emails') }
      end

      describe "with invalid information" do
        before { click_button "Save changes" }

        it { should have_content('error') }
      end

      describe "with valid information" do
        let(:new_name) { "New Name" }
        let(:new_email) { "new@example.com" }
        before do
          fill_in "Name",             with: new_name
          fill_in "Email",            with: new_email
          fill_in "Password",         with: user.password
          fill_in "Confirm Password", with: user.password
          click_button "Save changes"
        end

        it { should have_title(new_name) }
        it { should have_selector('div.alert.alert-success') }
        it { should have_link('Sign out', href: signout_path) }
        specify { expect(user.reload.name).to eq new_name }
        specify { expect(user.reload.email).to eq new_email }
      end
    end
  end
     end
  end
 end

我特别好奇“在'块(7级)中”是什么意思。这个级别上的某些内容是某些内容还是指其他内容?什么是'块'参考?

我似乎也无法理解我得到的水豚错误。它出现在第8章,走了,现在又回来了。当我把它拿出来的时候,页面上有按钮,所以我认为水豚只是找不到它。任何人都可以解释它是如何工作的吗?

'嵌套'是指什么?

任何人都知道一个好的网站打破了这个?我会非常乐意自己做这项工作,但我找不到。我真的很想能够自己解读这个,而不是谷歌搜索它,希望答案在某个地方,或者不得不依赖别人来解释它。

非常感谢你的时间和任何帮助。

2 个答案:

答案 0 :(得分:1)

现在是我过度简化时Stack Overflow上的时间了。 (Google的'ruby block'可以在这里阅读更多内容。)Ruby中的一个块是一堆代码,它被传递给像参数这样的方法。例如,

[1,2,3].each{|n| puts n * n }

each是方法(在数组[1,2,3]上调用),括号中的所有内容都是块。方法each的工作方式是,它会调用枚举中的每个元素([1,2,3])并一次生成一个元素到代码块:

|the first element is 1| puts 1 * 1
|next is 2| puts 2 * 2
|etc| puts 3 * 3

也可以在do...end之间编写一个块。 Ruby方法是使用括号,如果你可以将块放在一行上,而do...end则另外 - 这就是你在规范中的方式。在您的规范中,每个地方都有do和匹配的end是一个块,在另一个内嵌套。这些方法更难注意到,因为RSpec使它看起来像自然语言,但每次在行的开头写describeit都是方法调用。 (那么letbefore以及subjectexpect也是如此,在您的规范中使用单行块进行调用。)

所以消息'block(7 levels)'意味着你的错误嵌套在那么多块中:

describe "AuthenticationPages" do #starts the first block
  ...
  describe "signup" do #starts the second

等等。

现在,您的错误消息。第一个和第二个基本上是告诉你同样的事情 - 你访问edit_user_path(user)并且你没有在页面标题中看到“登录”按钮或“登录”。检查log / test.log文件 - 访问该页面时会发生什么?它是重定向到登录页面吗?它应该是,但它看起来不是。

另外两条错误消息说的完全一样 - 规范不知道sign_in的含义。你需要在RSpec可以找到它的地方定义一个方法 - 在规范本身,或在规范顶部你require的spec_helper文件,或在某个文件本身{{1在spec_helper里面。

最后,我认为Hartl是对的 - 你最好用谷歌的错误消息和堆栈痕迹,当你找不到你想要的东西时问你,你会更好地随时间计算出你自己的东西

答案 1 :(得分:1)

Re:sign_in - 在第9.1.1节,清单9.6(在Rails 4版本的书中)中,sign_in函数被添加到spec / support / utilities.rb中。

我得到了同样的错误,因为我在utilities.rb中的函数是“signin”而没有下划线。一旦我添加了下划线(并将另一个引用更改为匹配的相同函数),测试就变为绿色。