4

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

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

所以,我想用的验证和会话变量也控制器....

  1. 如何通过 会话变量进入模型的价值?或

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

谢谢大家。 :)

+0

嗨siulamvictor, 你能详细说明你的问题,你想做什么。因为通常你不需要访问模型的会话,即使你这样做也可能有另一种方式做它 欢呼声, sameera – sameera207 2010-06-10 06:27:47

+0

嗨sameera。这实际上是一面旗帜。我有一个需要处理很多视图的模型,但不同的视图在这个模型中需要不同的验证规则。我想为这种控件使用一个变量。 – 2010-06-10 07:06:48

回答

6

如果我理解正确,会话变量将改变验证模型的方式。我相信正确的解决方案如下:

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 

该代码还没有testet,但这就是主意。 if参数可以是方法的名称,你可以在那里做任何你想做的事情。如果你愿意,你可以有各种验证模式。例如:

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 

欲了解更多信息,请阅读the guide on validation

+0

非常感谢这位朋友〜它对我很好! – 2010-06-11 03:34:21

1

这样做的最佳方法是创建一个带参数的方法并通过session as an argument

FRO例如

class User < ActiveRecord::Base 

    def self.some_method(some_arg) 
    User.find(some_arg) 
    end 

end 

从控制器

User.some_method(session[:user_id]) 
+0

感谢哥们。但我需要验证中的会话变量。你有什么建议吗? – 2010-06-10 05:10:35

1

模型是对数据库的接口。它们可以在没有会话的情况下使用(例如从IRB)。允许模型与会话交谈会违反MVC。你能否扩展你的问题,提供更多关于你想要做什么的信息?最有可能有更好的方法来做到这一点。

+0

嗨zaius。我需要这个,因为我有一个根据不同情况在控制器中被更改的标志,并且模型将需要这个标志来选择正确的验证规则。你有什么建议吗?谢谢。 :) – 2010-06-10 07:10:25

2

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

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

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

,只是添加验证像往常一样在模型中。

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

class SomeController 
    before_filter :set_some_session_variable 

    def set_some_session_variable 
    @some_variable = session[:some_key] 
    end 
end 

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

+0

嗨丘巴斯。感谢您的回复。是的,这是一面旗帜。我会尝试你建议的解决方案。 – 2010-06-10 07:09:03

相关问题