助手没有定义方法

时间:2014-02-25 18:34:11

标签: ruby-on-rails ruby ruby-on-rails-3

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"=>"dduck@blah.com", "password"=>"[FILTERED]"}, "com
mit"=>"Sign in"}
Person Load (0.1ms)  SELECT `persons`.* FROM `persons` WHERE `persons`.`email` = 'dduck@blah.com' 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'

从控制台检查时,Person位于数据库表中。 我的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 个答案:

答案 0 :(得分:3)

Helper方法可以从视图中获得,而不是从Controller中获得。

要从Controller中使用它们(取自here),您可以:

  1. 在控制器中包含辅助模块
  2. 将帮助程序定义为控制器方法,并通过helper_method :method_name将其标记为帮助程序。
  3. 在你的情况下,因为你将使用SessionsHelper中的几个方法,我认为最好包括这样的帮助:

    class SessionsController < ApplicationController
      include SessionsHelper
    
    
      ...
    end
    

答案 1 :(得分: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

答案 2 :(得分: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