从模块访问会话变量或控制器变量

时间:2011-10-22 14:38:49

标签: ruby-on-rails ruby session module

使用:Rails 3.0.3

我有我的网站的这个功能(计算计算.com),它包含大量不同的计算。用户可以通过表单设置自己的小数(有效数字)变量。首先,我将此变量设置为configatron变量,结果证明是一个坏主意(某些用户所做的更改已传递给所有用户)。

所以,我决定把它变成一个会话变量,这是有道理的,因为用户应该选择自己的十进制值。

现在,在控制器中我调用一个模块函数,该函数依次调用100个不同的模块函数。

我的问题:

我想在该模块中访问此会话变量,结果证明这是不可能的。已经从控制器(通过模型)传递它是一个噩梦,因为它需要为每个功能传递。

所以:

  1. 如何从lib-catalog中的模块访问会话变量?
  2. 如何从模块访问控制器方法?如果是这样,我可以调用该方法并获取会话变量。

3 个答案:

答案 0 :(得分:3)

你的意思是红宝石模块吗?在混合中?如果您将其包含在控制器中,则它已经可以访问控制器可以访问的所有内容。只需致电sessionrequestparams等,一切正常。

如果确实需要从系统的某个任意部分获取会话,您可以通过以下方式获取请求:

ActionDispatch::Request.new(ENV)

然后您可以从请求中获取会话。 (请注意,请求实际上是伪装的单例...如果已经构建了一个新请求,它将不会构建新请求。)

答案 1 :(得分:1)

这是一种方法,将计算模块混合到控制器

# application_controller contains a method that wraps your session value
class ApplicationController < ActionController::Base
    protect_from_forgery

    def user_value
        return 5 # really a session value
    end
end

包含计算方法的模块需要访问会话,因为您将它混合到控制器中,您可以使用self调用user_value方法

module CalculationModule  
    def super_cool_calculation
        return self.user_value * 420
    end

    # more calculation methods  
end

注意self.user_value调用,该方法未在模块中定义,但您需要在混合的类中定义它

class FooController < ApplicationController
    include CalculationModule

    def show
        @calculation = super_cool_calculation # call calculation module method
    end

# etc...

如果您的任何模型对象也定义了user_value方法,那么您可以将计算模块混合到那些(如果需要),它们可能无法从会话中获取值

要考虑的其他事项,只需将用户定义的值存储在数据库而不是会话中,您就可以轻松访问模型或控制器中的值

答案 2 :(得分:1)

听起来你的模型包含模块代码。你真的真的不想直接从那里使用或访问会话。它打破了MVC的目的,Rails正在尽最大努力阻止你尝试类似的东西。

当你说“我调用一个模块函数时,它依次调用100个不同的模块函数,具体取决于id。”我想看看那块代码。

你最初的想法是正确的......价值需要传递给模型......听起来好像代码需要干掉一点才能让它不那么令人头疼

如果没有看到代码,很难提出建议。我遇到了类似的情况,并使用动态方法(重写method_missing)来解决问题。