例如,地址为“ 0x007f6f0954e820”字符串,如何获取实际对象?
我写这些: 在GymsController中
class GymsController < ApplicationController
@@gyms = Array.new
def private_page
...
cookies.permanent[:gyms] = JSON.generate(@@gyms << @page)
end
end
和history.html.slim
中- content_for :title, "History"
- breadcrumb :history
= stylesheet_link_tag 'application'
.outer
main.privacy-index
.content-wrapper
h1.headline2 History一覧
- JSON.parse(cookies.permanent[:gyms]).reverse.each do |value|
= (value.to_s.split(":").last)[0..-2].inspect
br
(value.to_s.split(":").last)[0..-2].inspect
是“ 0x007f6f2b587b30”
但是我想得到真实的物体,并且喜欢value.title
,value.images
答案 0 :(得分:0)
我不知道通过内存地址(即您的0x007f6f2b587b30
)“获取”对象的方法,
但是您可以使用object_id
通过 ObjectSpace._id2ref(OBJECT_ID)
“获取”对象:
重要提示:这仍然存在继承问题:请参阅下面我的建议。
app / controllers / gyms_controller.rb:
class GymsController < ApplicationController
@@gyms = Array.new
def private_page
...
gym = @page
@@gyms << gym
cookies.permanent[:gyms_object_ids] = gym.object_id
end
end
您的查看文件:
- content_for :title, "History"
- breadcrumb :history
= stylesheet_link_tag 'application'
.outer
main.privacy-index
.content-wrapper
h1.headline2 History一覧
- cookies.permanent[:gyms_object_ids]).reverse.each do |gym_object_id|
- gym = ObjectSpace._id2ref(gym_object_id.to_i)
= gym.title
= gym.images
br
使用“类实例变量” @gyms
代替“类类变量” @@gyms
。看看为什么要here。
如果您在控制器中的@page
变量不是记录(因为它与您拥有的任何模型都不对应,因此未保存在数据库中),则创建一个模型,以便您可以将其保存到数据库中,并通过模型的记录id
在上面的视图中检索这些数据,因此不再通过object_id
。
这将使您解决我的解决方案的以下问题 以上:
对象驻留在内存中,并且需要进行垃圾回收。因此,如果对象已经被垃圾回收,则使用ObjectSpace._id2ref(OBJECT_ID)
可能有时会失败。 (see this SO),因为上面的ObjectSpace._id2ref
在我的解决方案代码中运行的执行代码与对象最初定义的位置不同:
@page
对象(某些request1 /例如thread1),ObjectSpace._id2ref()
试图获取该对象(某些request2 /例如thread2),在您的代码中,您使用的是@@gyms = Array.new
,这意味着@@gyms
(存储在内存中)将无法被其他Rails进程访问,因为在这些之间没有共享内存流程,而简单地表示@@gyms
对于以下每个流程将具有 DIFFERENT!值:
...而如果您将gyms
(如果可能且仅在必要时)保存到模型中,并且这些健身记录属于用户,那么我可以想像执行以下操作(解决上面的这些潜在的不同值,将不再需要您使用Cookie):
class Gym < ApplicationRecord
has_many :gyms_users
has_many :users, through: :gyms_users
end
class GymsUser < ApplicationRecord
belongs_to :gym
belongs_to :user
validates :user, uniqueness: { scope: :gym }
end
class User < ApplicationRecord
has_many :gyms_users
has_many :gyms, through: :gyms_users
end