2013-07-18 105 views
0

抱歉,我不能短語的問題更好。我正沿着Michael Hartl的Rails教程進行學習。這是一個驚人的書,我完全明白了一切,直到這個sign_in方法Ruby on Rails的自我

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

輔助方法在SessionsController

class SessionsController < ApplicationController 
    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' 
     render 'new' 
    end 
    end 
...... 

使用我知道自我評估當前的對象和CURRENT_USER是一個屬性。但是,這裏的目標是什麼?誰稱爲sign_in(用戶)?

回答

0

在Rails的早期版本中,的namespacing確定哪個controllers視圖可以使用助手。

+0

你能更具體?我試着用'SessionsController.new.sign_in user'更換'sign_in user'但得到的錯誤'cookies.permanent [:remember_token] = remember_token' – otchkcom

+0

@otchkcom這裏的假設是,如果這本書是舊的,它ISN 't,使用的導軌版本將包含名稱相似的控制器中的助手。不知道這是作爲答案還是洞察力。 – rafb3

0

在該控制器的方法的自爲實際控制器實例,因爲該模塊被包括在類,基本上延伸它與在其內聲明的方法的功能稱爲運行的類的實例在其內部時,其具有訪問它就像在課堂中定義的方法一樣。你可以閱讀更多關於這些here

如果因爲該類不存在該方法而出現錯誤,那是因爲您沒有包含如answer to a similar question中所示的模塊。 (這是解釋in the book)。

現在,爲什麼您可以直接在this comment訪問控制器時出現錯誤的原因。是因爲您沒有像rails路由器那樣正確設置它,添加了所有的請求信息和其他對象,比如cookie jar。

如果你想知道它是如何工作的,看在action pack dispatcher

SessionController.action(:new).call(env) 

env來自調度員從一路接收回從機架中,並且基本上request是你會得到什麼從一個HTTP請求,一個字符串散列,其中包含標題作爲鍵和它們的值作爲值。