【问题标题】:Globally have access to session in rails在全球范围内可以访问 Rails 中的会话
【发布时间】:2017-03-07 19:52:25
【问题描述】:

除了控制器之外,是否可以在普通的.rb 文件中使用session 变量?

我正在使用这个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,但是controller 是nil: main)

是否可以从listen.rb 文件中将数据存储在会话中?

【问题讨论】:

    标签: ruby-on-rails session


    【解决方案1】:

    UserInfo 模块封装了从/向 Thread 本地读取和写入 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
    

    在您需要访问这些值的模型类中的任何时候,您都可以混入帮助模块,然后使用它的方法来访问数据。在最后一个示例中,我们将 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
    

    【讨论】:

      猜你喜欢
      • 2017-01-03
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 2019-12-03
      相关资源
      最近更新 更多