存储和检索会话对象

时间:2013-04-09 08:19:49

标签: ruby-on-rails ruby

我将对象存储在会话对象中的哈希中,如下所示:

    hash_key = ImportantData.new
    hash_key.test_id = params[:test_id]
    hash_key.user_id = params[:user_id]

    session[:important_data] ||= {}
    session[:important_data][hash_key] = nil

然后我在我的另一个控制器中打印这个地图session[:important_data][hash_key]并尝试检查对象是否在那里:

hash_key = ImportantData.new
hash_key.schedule_id = @test.id
hash_key.user_id = @user.id

in_hash = session[:important_data].has_key?(hash_key) unless session[:important_data].nil?

in_hash总是对我不对,我做错了什么?还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

在Ruby中,哈希键work by equality。只要您使用的密钥等于存储的密钥,就可以在哈希中存储和检索值。

例如:

hsh = { 'hello' => 'world' }
p hsh['hello']        #=> "world"
'hello'.eql? 'hello'  #=> true

您可以检索该值,因为Ruby中的相同值字符串始终为eql?

大多数对象不是这种情况:

class Example; end

object1 = Example.new
object2 = Example.new
object1.eql? object2    #=> false

因此,用于存储在哈希中的密钥必须是eql?到您用于检索的密钥。 eql?相当于== and equal?

您正在创建两个ImportantData的实例,它们彼此不相等。看起来你可以用一个哈希键完成你想要的东西:

hash_value = ImportantData.new
hash_value.test_id = params[:test_id]
hash_value.user_id = params[:user_id]

session[:important_data] ||= hash_value
puts session[:important_data].class.name    #=> ImportantData
session[:important_data].test_id            #=> puts out value of test_id

答案 1 :(得分:0)

我认为你应该像这样分配

session[:important_data][:hash_key] = hash_key

并访问它

session[:important_data][:hash_key]