Ruby on rails 在Rails控制器中存储对象的最佳方式(会话除外)?
我有一个rails控制器Ruby on rails 在Rails控制器中存储对象的最佳方式(会话除外)?,ruby-on-rails,ruby,session,controller,Ruby On Rails,Ruby,Session,Controller,我有一个rails控制器 class Controllername < application def method1 obj = API_CALL session =obj.access_token redirect_to redirect_url #calls the API authorization end point #and redirects to action method2
class Controllername < application
def method1
obj = API_CALL
session =obj.access_token
redirect_to redirect_url #calls the API authorization end point
#and redirects to action method2
end
def method2
obj.call_after_sometime
end
end
当我在会话中存储加密值时,通过谷歌搜索发现它会抛出此错误。您可以尝试缓存它,但要小心缓存密钥,如果每个用户的对象都是唯一的,则在缓存密钥中添加用户id
class Controllername < application
def method1
obj = API_CALL
Rails.cache.write("some_api_namespace/#{current_user.id}", obj)
session =obj.access_token
end
def method2
obj = Rails.cache.read("some_api_namespace/#{current_user.id}")
obj.call_after_sometime
end
end
我也试着这样做:在会话中将obj写入一个键中,然后用第二种方法再次读出它
class Controllername < application
def method1
obj = API_CALL
session[:obj] = obj
end
def method2
if obj = session[:obj]
obj.call_after_sometime
end
end
end
class Controllername<应用程序
定义方法1
obj=API\u调用
会话[:obj]=obj
结束
定义方法2
如果obj=会话[:obj]
找个时间给你打个电话
结束
结束
结束
使用实例变量@obj
我试过了。在method2
中,如果控制器类在两次调用期间都保持加载状态,那么为什么不尝试类变量
。我对类变量的用法不太熟悉。我应该初始化到什么值。您不应该设置session=
。将会话视为可以存储值的散列,例如,你可以说session[:foo]=“bar”
。这不起作用,因为obj包含加密对象,它抛出SSL错误只需写入访问令牌即可,或者您需要执行的任何操作“某个时间后调用”我需要整个对象,而不仅仅是访问令牌。在随后的调用中,method2上变量obj(实例或类)的值变为null,我需要它与method2中的值相同。你有什么解决办法吗?请原谅我的耽搁。但是,当我尝试的时候。它得到了与使用会话相同的错误(SSL错误)您能否将该错误添加到问题中,还有obj.class
了解该对象的类别object@Rocky29您使用的是什么api?我使用的是第三方api,在从method1重定向期间,它会将一些授权值发送到method2,并在稍后使用obj.call_和我需要的授权值进行未来的api调用。我的问题是,一旦obj到达Method2,它就会变为零。由于某种原因,对象可能无法序列化。您应该找到可以保存的最小数据量,以便执行后续请求,而不是将对象作为一个整体保存,例如,此访问令牌是否足够?
def method2
obj = Rails.cache.fetch("some_api_namespace/#{current_user.id}") do
method_1
end
obj.call_after_sometime
end
class Controllername < application
def method1
obj = API_CALL
session[:obj] = obj
end
def method2
if obj = session[:obj]
obj.call_after_sometime
end
end
end