除了控制器之外,是否可以在普通session
文件中使用.rb
变量?
我使用此facebook messenger rails gem来构建机器人。所有请求都来自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
Module :: DelegationError(ActionView :: Helpers :: ControllerHelper#session委托给controller.session,但是控制器是nil:main)
是否可以在listen.rb
文件中存储会话中的数据?
答案 0 :(得分:2)
UserInfo模块封装从/向本地线程读取和写入User对象。然后可以将此模块与其他对象混合以便于访问。
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
在Model类中您需要访问这些值的任何时候,您只需混合帮助程序模块,然后使用其方法来访问数据。在最后一个例子中,我们将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