全球可以访问rails中的会话

时间:2017-03-07 08:57:17

标签: ruby-on-rails session

除了控制器之外,是否可以在普通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文件中存储会话中的数据?

1 个答案:

答案 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