使用:Rails 3.0.3
我有我的网站的这个功能(计算计算.com),它包含大量不同的计算。用户可以通过表单设置自己的小数(有效数字)变量。首先,我将此变量设置为configatron变量,结果证明是一个坏主意(某些用户所做的更改已传递给所有用户)。
所以,我决定把它变成一个会话变量,这是有道理的,因为用户应该选择自己的十进制值。
现在,在控制器中我调用一个模块函数,该函数依次调用100个不同的模块函数。
我的问题:
我想在该模块中访问此会话变量,结果证明这是不可能的。已经从控制器(通过模型)传递它是一个噩梦,因为它需要为每个功能传递。
所以:
答案 0 :(得分:3)
你的意思是红宝石模块吗?在混合中?如果您将其包含在控制器中,则它已经可以访问控制器可以访问的所有内容。只需致电session
,request
,params
等,一切正常。
如果确实需要从系统的某个任意部分获取会话,您可以通过以下方式获取请求:
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)来解决问题。