从另一个控制器轨道访问一个控制器的变量



在我的rails应用程序中,我有answer_controller和connect_controller。应用程序>控制器>answer_controller和应用程序>控制器>连接控制器

我的connect_controller有以下代码。

@url = api_version_root+'/members/all?council='+session[:council]
response = RestClient.get @url, api_token_hash
if response.code == 200
@members = JSON.parse(response.body)
end

我想访问answer_controller中的@members。我该怎么做。

控制器实例变量只存在于单个请求中,并且在Rails中,每个请求只调用一个控制器操作。这通常也适用于任何框架/平台。如果你想在请求之间持久化任何东西,你需要将其传递或存储在某个地方,因为响应请求的线程在完成服务请求时终止,并且其变量也随之消失

有很多方法可以在客户端和服务器之间来回传递数据,如查询字符串参数、cookie和会话(默认存储在cookie中(。大小受到客户端的严格限制,例如cookie大小限制约为4096字节,URL的实际大小限制为2000个字符。

您可以使用rails内置的缓存机制、数据库、基于内存的存储(如Memcached和Redis(或服务器文件系统将数据持久化。

使用哪一个取决于它的使用方式、数据的大小以及您的体系结构。

[MVC模型]根据请求,只调用一个Controllers#操作。

如果您想重用一个变量,请将其放入会话


session[:members] = @members

我会使用Rails缓存,但您必须仔细考虑如何使缓存过期。因此:

@members = cached_members
private
def cached_members
@url = api_version_root+'/members/all?council='+session[:council]
Rails.cache.fetch("#{@url}/#{api_token_hash}/members", expires_in: 48.hours) do
response = RestClient.get @url, api_token_hash
(response.code == 200) && JSON.parse(response.body)
end
end

然后在应答控制器中重复这一点,@members将从缓存中填充。现在,当然,实际上复制代码是一种糟糕的做法,所以把它拉到一个辅助混合中,比如:

module MemberCache
def cached_members
@url = api_version_root+'/members/all?council='+session[:council]
Rails.cache.fetch("#{@url}/#{api_token_hash}/members", expires_in: 48.hours) do
response = RestClient.get @url, api_token_hash
(response.code == 200) && JSON.parse(response.body)
end
end
end

并将其包含在两个控制器中:

require 'member_cache'
class ConnectController < ApplicationController
include MemberCache
end

相关内容

  • 没有找到相关文章

最新更新