家伙! 在询问之前我应该提一下,我在没有ActiveRecord或任何自托管数据库的情况下工作。这就是为什么我必须在会话中存储一些值。
从一开始我就决定在布局中设置用户城市的会话值。 - 我想它会在其他任何东西之前加载。所以我做了类似的事情:
<% session[:city] ||= {:name => 'City-Name', :lat => '40', :lng => '40'}%>
但是当我直接加载到内页时会发生会话[:city is nil *(
我应该如何设置会话,以便它不会是nil ???
答案 0 :(得分:1)
我在其中一个应用程序中有类似的需求。它需要在登录时加载用户数据并存储在会话中。因此,编写了一个名为session_helpers.rb的模块,其中包含以下内容:
module SessionHelpers
def get_value(key)
session[key.to_sym]
end
protected
def store_data(*objects)
objects.each do |object|
if object.is_a?(Hash)
object.each do |key, value|
session[key.to_sym] = value
end
end
end
end
def remove_data(*objects)
objects.each do |object|
if object.is_a?(String)
key = to_id(object)
else
key = to_id(object.class.name)
end
session[key] = nil
end
end
def update_data(key, value)
session[key.to_sym] = value
end
private
def to_id(name)
"#{name.parameterize('_').foreign_key}".to_sym
end
end
您也可以将任何或所有方法用于视图:
# application_controller.rb
helper_method :get_value
从模型中我将检索需要在关于用户的会话中放置的数据的哈希值:
def common_data
@data = Hash.new
@data.merge!( { 'news' => self.news.count } )
...
@data
end
我想在登录后执行此操作后,我会覆盖设计方法来执行此操作:
def after_sign_in_path_for(resource_or_scope)
store_data( '_count', current_user.common_data )
dashboard_path
end
通过这种方式,我可以在登录时加载有关用户的重要数据,并将其存储在会话中并随时检索。希望这会有所帮助。