如何将会话变量传递给RoR中的模型?

我在我的应用程序中使用了一个全局变量来传递信息。 但是我遇到了一个问题,谢谢大家在这里建议我将这些数据存储在与数据库的会话中。

我试过,但我发现我无法访问Model中的会话变量。 我用谷歌搜索并知道这是模型正常行为,RoR不会将会话变量传递给模型。

所以,我想在validation和控制器中使用该会话变量….

  1. 如何将会话变量的值传递给模型? 要么

  2. 我的用例有什么其他方法吗? 我需要一个存储值的变量,这是所有MVC所必需的,并且应该在不同的并发用户之间独立。

感谢大家。 🙂

如果我理解正确,会话变量会改变您validation模型的方式。 我相信对此的正确解决方案如下:

class Blog < ActiveRecord::Base attr_accessor :validate_title validate_presence_of :title, :if => :validate_title end class BlogsController < ApplicationController def new @blog = Blog.new @blog.validate_title = session[:validate_title] end end 

代码没有被测试,但这就是想法。 if参数可以是方法的名称,您可以在那里做任何你想做的事情。 如果需要,您可以使用各种validation模式。 例如:

 class Blog < ActiveRecord::Base attr_accessor :validation_mode validate_presence_of :title, :if => :validate_title def validate_title validation_mode == "full" or validation_mode == "only_title" end end class BlogsController < ApplicationController def new @blog = Blog.new @blog.validate_mode = session[:validate_mode] end end 

有关更多信息,请阅读有关validation的指南 。

您是否需要将会话变量作为模型的一部分,或者仅作为标志来确定要执行的内容?

如果是前者,您不需要知道参数的来源,只需将变量作为参数传递给方法中的某个调用。 例如:

@user = User.new(params[:user].merge(:some_attribute => session[:some_key])

并且只需在模型中添加validation。

如果您需要控制某些执行流程,正如您所提到的那样,对于不同的用户应该是不同的,您可能需要在控制器中使用实例变量。 就像是

 class SomeController before_filter :set_some_session_variable def set_some_session_variable @some_variable = session[:some_key] end end 

您可以在视图中直接使用session[:some_key] ,但最好将其设置在实例变量中。

这样做的最佳方法是使用参数创建方法并将session as an argument传递。

举个例子

 class User < ActiveRecord::Base def self.some_method(some_arg) User.find(some_arg) end end 

来自控制器

 User.some_method(session[:user_id]) 

模型是数据库的接口。 它们可以在没有会话的情况下使用(例如来自IRB)。 允许模型与会话进行通信将违反MVC。 您可以通过更多关于您要做的事情的信息来扩展您的问题吗? 最有可能是一种更好的方法。