2014-02-25 58 views
1

Ruby on Rails 3.2幫手沒有定義方法

我的sessions_controller.rb檢查'signed_in_person'是否已經有記錄的會話時繞過登錄。

我「signed_in_person」在session_helper.rb定義,但我得到一個錯誤:

Started POST "/sessions" for 50.241.102.227 at 2014-02-25 10:12:33 -0800 
Processing by SessionsController#create as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"fFo4EM1MOHNO1Thic6qA/uapGj8pbiNaepKYF5Ge0Tw=", "session"=>{"email"=>"[email protected]", "password"=>"[FILTERED]"}, "com 
mit"=>"Sign in"} 
Person Load (0.1ms) SELECT `persons`.* FROM `persons` WHERE `persons`.`email` = '[email protected]' LIMIT 1 
Completed 500 Internal Server Error in 66ms 

NoMethodError (undefined method `sign_in_person' for #<SessionsController:0x00000004f7ace8>): 
app/controllers/sessions_controller.rb:11:in `create' 

從控制檯檢查時,該人是在數據庫表中。 我sessions_controller:

def create 
    if params[:session][:email].include? 'blah.com' 
     person = Person.find_by_email(params[:session][:email].downcase) 
     if person && person.authenticate(params[:session][:password]) 
      sign_in_person person 
      redirect_back_or person 
     else 
      flash.now[:error] = 'Invalid email/password combination' 
      render 'new' 
     end 
    else 
     ... 
    end 
end 

我sessions_helper:

module SessionsHelper 

# For Persons 

def sign_in_person(person) 
    cookies[:remember_token] = person.remember_token 
    self.current_person = person 
end 

def signed_in_person? 
    !current_person.nil? 
end 
    ... 

任何想法,爲什麼我的sessions_helper是沒有幫助?

回答

3

輔助方法可以從視圖中獲得,而不是從控制器獲得。

來自控制器使用它們,(來自here兩者)​​,則可以:

  1. 包括在控制器
  2. 輔助模塊定義助手作爲控制器的方法和其標記爲經由一個輔助helper_method :method_name

在你的情況,因爲你將使用從SessionsHelper幾種方法,我認爲這將是最好包括這樣的幫手:

class SessionsController < ApplicationController 
    include SessionsHelper 


    ... 
end 
+0

這並沒有改變錯誤,:(如果我添加,'包括SessionsHelper'給我的persons_controller錯誤消失了,那好嗎? – DDDD

+0

@DDDD這真的很奇怪,因爲錯誤日誌說你試圖從'SessionsController'調用'sign_in_person' ..你是否也在'PersonsController'上使用過該方法? – raviolicode

+0

不,但PersonsController是使用SessionsController – DDDD

1

這通常是不好的做法,但你可以使用view_context.sign_in_person從你的控制器。我相信你也可以使用helper方法在你的控制器,這樣的事情:

class SessionsController < ApplicationController 
    helper :sessions 

    ... 
end 

助手一般都應該是對的意見。就像raviolicode說的那樣,你可以將它移動到控制器,並使用helper_method使它可以被控制器和視圖訪問。

# in controller 
def sign_in_person 
    .... 
end 
helper_method :sign_in_person 

如果只想從你的控制器,它可能最好只是做一個私有方法控制器本身的內部,或將其移動到concern

1

如果你想從一個控制器內調用一個輔助方法,你需要根據它是否是輔助類或實例方法來調用它:

# app/controllers/sessions_controller.rb 
class SessionsController < ApplicationController 
    include SessionsHelper 

    def create 
    person = Person.find_by_email(params[:session][:email].downcase) 
    SessionsHelper.sign_in_person person # Class method invocation 
    sign_in_person person # Instance method invocation 
    end 

end 

# app/helpers/sessions_helper.rb 
module SessionsHelper 

    # Instance method 
    def sign_in_person(person) 
    cookies[:remember_token] = person.remember_token 
    SessionHelper.current_person = person 
    end 

    # Class method 
    def self.sign_in_person(person) 
    cookies[:remember_token] = person.remember_token 
    self.current_person = person 
    end 

end