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

时间:2010-06-10 03:38:13

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

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

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

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

  1. 如何传递值 会话变量进入模型?或

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

  3. 谢谢大家。 :)

4 个答案:

答案 0 :(得分: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

代码没有被测试,但这就是想法。 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

答案 1 :(得分: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],但最好将其设置在实例变量中。

答案 2 :(得分:1)

执行此操作的最佳方法是使用参数创建方法并传递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])

答案 3 :(得分:1)

模型是数据库的接口。它们可以在没有会话的情况下使用(例如来自IRB)。允许模型与会话进行通信将违反MVC。您可以通过更多信息扩展您的问题,了解您正在尝试做什么吗?最有可能采用更好的方法。