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没有帮助的任何想法?
答案 0 :(得分:3)
Helper方法可以从视图中获得,而不是从Controller中获得。
要从Controller中使用它们(取自here),您可以:
helper_method :method_name
将其标记为帮助程序。 在你的情况下,因为你将使用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