我在我的应用程序中使用了一个全局变量来传递信息。但我遇到了一个问题,谢谢大家在这里建议我将这些数据存储在与数据库的会话中。
我试过,但我发现我无法访问Model中的会话变量。我用谷歌搜索并知道这是模型正常行为,RoR不会将会话变量传递给模型。
所以,我想在验证中使用该会话变量以及控制器......
如何传递值 会话变量进入模型?或
还有其他方法吗? 用例?我需要一个变量存储 一个值,这是所有人都需要的 MVC,应该是独立的 不同的并发用户之间。
谢谢大家。 :)
答案 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。您可以通过更多信息扩展您的问题,了解您正在尝试做什么吗?最有可能采用更好的方法。