Доступ к переменной одного контроллера с рельсов другого контроллера - PullRequest
0 голосов
/ 14 июля 2020

В моем приложении rails есть answer_controller и connect_controller. app> controllers> answer_controller и app> controllers> connect_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

Я хочу получить доступ к @members в answer_controller. Как я могу это сделать.

Ответы [ 3 ]

1 голос
/ 14 июля 2020

Переменные экземпляра контроллеров присутствуют только для одного запроса, и только одно действие контроллера вызывается для каждого запроса в Rails по замыслу. Это также обычно верно для любой платформы / платформы. Если вы хотите сохранить что-либо между запросами, вам нужно либо передать это, либо сохранить где-нибудь, поскольку поток, отвечающий на запрос, завершается, когда он завершает обслуживание запроса, и его переменные исчезают с ним.

Есть множество способов передачи данных туда и обратно между клиентом и сервером, например параметры строки запроса, файлы cookie и сеанс (по умолчанию хранятся в файлах cookie). Размер строго ограничен клиентом, например, ограничение размера Cook ie примерно в 4096 байт и ограничение на фактический размер 2000 символов для URL-адресов .

Вы можете сохранить данные на сервер с использованием рельсов, встроенных в механизм кеширования , базу данных, хранилище на основе памяти (например, Memcached и Redis) или файловую систему сервера.

Что использовать, зависит от того, как именно он используется , размер данных и ваш архитектурный стиль.

0 голосов
/ 14 июля 2020

[MVC Модель] По запросу вызывается только одно действие Controllers #.

Если вы хотите повторно использовать переменную, поместите ее в сеанс


session[:members] = @members
0 голосов
/ 14 июля 2020

Я бы использовал кеширование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...