我将对象存储在会话对象中的哈希中,如下所示:
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
总是对我不对,我做错了什么?还有更好的方法吗?
答案 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]