2012-09-30 53 views
0

完成Michael Hart的導軌教程後,一個簡單的應用程序,我自己的嘗試。嘗試創建用戶會話 - >沒有路由匹配{:action =>「show」,:controller =>「users」,:id => nil}

我設法創建用戶資源,現在正在嘗試創建會話資源,以便跟蹤某人何時登錄。我遇到了一些非常古怪的結果。

1)我試圖顯示不同的菜單選項,當有人登錄時,以及有人註銷時。它的工作原理,除了它與我預期的方式相反!即當我寫

 <ul class="nav pull-right"> 
      <% if signed_in? %> 
       #menu for registered users 
      <% else %> 
       #menu for unregistered users    
      <% end %> 
     </ul> 

當我登錄,未註冊用戶的#menu顯示出來,當我註銷,註冊用戶的#menu顯示出來。

2)我也試圖創建一個鏈接到用戶的管理頁面,這基本上是用戶的ID頁面。

我把這個作爲下面的鏈接代碼

<%= link_to "Admin", user_path(current_user) %> 

,並得到了錯誤

沒有路由匹配{:動作=> 「秀」,:控制器=> 「用戶」 ,:id => nil}

這讓我覺得我在會話助手中定義的current_user沒有被保存,但比我想象的要多,但我不知道爲什麼。

下面是我對 用戶模型

class User < ActiveRecord::Base 
    attr_accessible :name, :email, :password, :password_confirmation 
    has_secure_password 

    before_save { |user| user.email = email.downcase } 
    before_save :create_remember_token 

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

    private 

     def create_remember_token 
      self.remember_token = SecureRandom.urlsafe_base64 
     end 

end 

會話控制器

class SessionsController < ApplicationController 

def new 
end 

def create 
    user = User.find_by_email(params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
     sign_in user 
     redirect_to user 
    else 
     flash.now[:error] = 'Invalid Email/Password Combination' #Not quite right; 
     render 'new' 
    end 
end 

末碼

SessionsHelper

module SessionsHelper 
    def sign_in(user) 
    cookies.permanent[:remember_token] = user.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 
    @current_user ||= User.find_by_remember_token(cookies[:remember_token]) 
    end 
end 

的ApplicationController

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    include SessionsHelper 
end 

的思考?

+0

Your current_user is nil。檢查你的current_user爲什麼爲空。可能會話變量沒有設置在登錄 –

+0

Hi Mohit,感謝您的評論 >可能會話變量未設置登錄 我該如何檢查? –

+0

在你的create方法中拋出一個調試器,並查看'session'變量是否可用。 –

回答

0

感謝您的幫助!好像我有兩個錯誤 - 1)在用戶控制器中註冊時沒有登錄用戶,2)我沒有重新啓動服務器,並執行db:reset。嘗試完成後,其他問題(與註銷無關)無法修復。

相關問題