【问题标题】:how to pass session variable to model in RoR?如何将会话变量传递给 RoR 中的模型?
【发布时间】:2011-03-01 23:42:31
【问题描述】:

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

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

所以,我想在验证中使用该会话变量以及控制器....

  1. 如何传递 会话变量到模型?或

  2. 还有其他方法可以解决我的问题吗? 用例?我需要一个变量存储 一个值,在所有情况下都是必需的 MVC,并且应该是独立的 不同并发用户之间。

谢谢大家。 :)

【问题讨论】:

  • 嗨 siulamvictor,您能否详细说明您想做什么的问题。因为通常你不需要从模型访问会话,即使你这样做也可能有另一种方法来干杯,sameera
  • 嗨,sameera。它实际上是一面旗帜。我有一个模型需要处理许多视图,但不同的视图需要在这个模型中使用不同的验证规则。我想为这种控制使用一个变量。

标签: ruby-on-rails model-view-controller session session-variables


【解决方案1】:

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

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 参数可以是方法的名称,您可以在其中做任何您想做的事情。如果需要,您可以有各种验证模式。例如:

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

【讨论】:

    【解决方案2】:

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

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

    @user = User.new(params[:user].merge(:some_attribute =&gt; 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],但最好将其设置在实例变量中。

    【讨论】:

    • 嗨丘巴斯。感谢您的回复。是的,它是一面旗帜。我会试试你建议的解决方案。
    【解决方案3】:

    最好的方法是创建一个带参数的方法并传递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])
    

    【讨论】:

    • 谢谢哥们。但我需要在验证中使用该会话变量。你有什么建议吗?
    【解决方案4】:

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

    【讨论】:

    • 你好 zaius。我需要这个,因为我有一个标志,它将根据不同的情况在控制器中更改,并且模型将需要这个标志来选择正确的验证规则。你对这个目的有什么建议吗?谢谢。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多