2017-03-07 32 views
0

可以在普通的.rb文件中使用session变量,除了控制器吗?全局有权访问会话in rails

我使用facebook messenger rails gem构建了一个bot。所有的请求都来到app/bot/listen.rb。在这种listen.rb文件:

require "facebook/messenger" 
extend ActionView::Helpers # I need also the session 
include Facebook::Messenger 

Bot.on :message do |message| 
    session[:demo] = 1 
    puts "Your session number is: #{session[:demo]}" 
end 

模块:: DelegationError(::的ActionView ::帮手#ControllerHelper会议委托给controller.session,但控制器是零:主)

是否有可能从listen.rb文件中存储会话中的数据?

回答

1

UserInfo模块封装读/写用户对象从/到Thread本地。然后可以将该模块与其他对象混合以便于访问。

module UserInfo 
    def session 
    Thread.session 
    end 

    def self.session=(session) 
    Thread.session = session 
    end 
end 

在任何控制器中调用任何操作之前,将调用ApplicationController中设置的before_filter。你可以利用这一点在线程本地的值复制出来的HTTP会话,并将其设置:

class ApplicationController < ActionController::Base 
    before_filter :set_user 

    protected 
    # Sets the current user into a named Thread location so that it can be accessed by models and observers 
    def set_user 
    UserInfo.session = session[:user] 
    end 
end 

在模型类,你需要访问这些值你可以混入任何点帮助程序模块,然后使用其方法访问数据。在这个最后的例子中,我们将UserInfo模块混入到我们的模型中,并且现在可以访问current_user方法:

class Account < ActiveRecord::Base 
    include UserInfo 

    after_update :log_audit_change 

    private 
    def log_audit_change 
    Audit.audit_change(current_user, self.id, self.new_balance) 
    end 
end