2014-04-18 63 views
0

在Rails教程中,本节结束,所有测试都失败了。任何帮助将非常感激。Rails教程第9章,9.2.2 - 43错误

我的用户控制器:

class UsersController < ApplicationController 
     before_action :signed_in_user, only: [:edit, :update] 
     before_action :correct_user, only: [:edit, :update] 

     def show 
     @user = User.find(params[:id]) 
     end 

     def new 
     @user = User.new 
     end 

     def edit 
     end 

     def update 
     if @user.update_attributes(user_params) 
      flash[:success] = "Profile updated" 
      redirect_to @user 
     else 
      render 'edit' 
     end 
     end 

     def create 
     @user = User.new(user_params) 
     if @user.save 
      sign_in @user 
      flash[:success] = "Welcome to the Sample App!" 
      redirect_to @user 
     else 
      render 'new' 
     end 
     end 

     private 

     def user_params 
      params.require(:user).permit(:name, :email, :password, 
             :password_confirmation) 
     end 

     # Before filters 

     def signed_in_user 
      redirect_to signin_url, notice: "Please sign in." unless signed_in? 
     end 

     def correct_user 
      @user = User.find(params[:id]) 
      redirect_to(root_url) unless current_user?(@user) 
     end 
    end 

我的认证规范:

require 'spec_helper' 

describe "Authentication" 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') } 

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

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

     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 
    end 
    end 

    describe "authorization" do 

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

     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 
     end 
    end 

    describe "as wrong user" do 
     let(:user) { FactoryGirl.create(:user) } 
     let(:wrong_user) { FactoryGirl.create(:user, email: "[email protected]") } 
     before { sign_in user, no_capybara: true } 

     describe "submitting a GET request to the Users#edit action" do 
     before { get edit_user_path(wrong_user) } 
     specify { expect(response.body).not_to match(full_title('Edit user')) } 
     specify { expect(response).to redirect_to(root_url) } 
     end 

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

我会帮手:

module SessionsHelper 

    def sign_in(user) 
    remember_token = User.new_remember_token 
    cookies.permanent[:remember_token] = remember_token 
    user.update_attribute(:remember_token, User.hash(remember_token)) 
    self.current_user = user 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
    remember_token = User.digest(cookies[:remember_token]) 
    @current_user ||= User.find_by(remember_token: remember_token) 
    end 

    def current_user?(user) 
    user == current_user 
    end 

    def sign_out 
    current_user.update_attribute(:remember_token, 
            User.hash(User.new_remember_token)) 
    cookies.delete(:remember_token) 
    self.current_user = nil 
    end 
end 

只是被问起User.rb模型文件,所以在这里它是......

class User < ActiveRecord::Base 
    before_save { self.email = email.downcase } 
    before_create :create_remember_token 

    has_secure_password 
    before_save { email.downcase! } 
    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(?:\.[a-z\d\-]+)*\.[a-z]+\z/i 
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 
    has_secure_password 
    validates :password, length: { minimum: 6 } 

    def User.new_remember_token 
    SecureRandom.urlsafe_base64 
    end 

    def User.hash(token) 
    Digest::SHA1.hexdigest(token.to_s) 
    end 

    private 

    def create_remember_token 
     self.remember_token = User.hash(User.new_remember_token) 
    end 
end 
+0

你的错误在说什么? –

+0

您可以举几个测试失败的例子,以便我们可以看到错误。 –

+0

30)用户页面保存后用有效信息注册 ←[31m失败/错误:←[0m←[31mbefore {访问注册路径}←[0m ←[31mActionView :: Template :: Error←[0m: ←[对于#<类:0x558c438>←[0m – robgreen48

回答

0

您正在呼吁User模式digest类的方法,但还没有确定它尚未这就是为什么你的错误作为undefined method 'digest'

在你User模型中,添加以下方法:

def User.digest(token) 
    Digest::SHA1.hexdigest(token.to_s) 
    end 

细节请参考8.2 Signin success部分。

+0

谢谢Kirti。我在User模型中有User.hash(token)方法,而不是User.digest(令牌)。改变它虽然不能解决它 – robgreen48

+0

你现在肯定会得到更少的错误。您可以使用错误消息和相关规范更新您的问题。那么我可以看看它。 –

+0

嗨Kirti - 我修好了。 User.hash()方法已经更新到User.digest(),我不得不将所有引用替换为旧方法。我现在通过了所有测试。谢谢你的帮助。 – robgreen48

相关问题