2016-05-18 2 views
0

Я пытаюсь получить доступ к переменной current_user Devise в новом экземпляре другого контроллера. Вот мое определение GetsInterfaceControllerДоступ к переменной current_user в другом контроллере

class GetsInterfaceController < ApplicationController 
    def select_current_signed_in_user 
    @signed_in_user_here = current_user 
    end 
end 

Затем я создаю экземпляр нового экземпляра GetsInterfaceController в ClientsController

class ClientsController < ApplicationController 
    def get_current_user 
    @gets_interface_controller = GetsInterfaceController.new 
    find_signed_in_user = @gets_interface_controller.select_current_signed_in_user 
    end 
end 

Но я получаю ошибку пустого на @signed_in_user_here = current_user линии в GetsInterfaceController, когда я пытаюсь это. В любом случае, чтобы получить атрибут current_user внутри GetsInterfaceController?

+1

Вы также можете получить доступ к 'current_user' из' ClientsController'. – Uzbekjon

+2

вам не нужно ничего делать - у вас есть доступ к current_user во всех ваших представлениях/контроллерах. – toddmetheny

ответ

0

current_user не является переменной - это вспомогательный метод. Таким образом, он уже доступен во всех ваших помощниках и представлениях.

Дополнительно вы никогда экземпляров контроллеров в Rails. Маршрутизатор делает это для вас.

Единственными общедоступными методами в ваших контроллерах должны быть действия, которые отвечают на запросы HTTP.

Если вы хотите повторно использовать метод в нескольких контроллерах, вы должны использовать наследование, модули (проблемы) или помощники. Никогда не вызывая метод на другом контроллере.


Чтобы вызвать внешнюю службу, которую нужно создать класс клиента API:

# adapted from https://github.com/jnunemaker/httparty 
require 'httparty' 
class StackExchangeClient 
    include HTTParty 
    base_uri 'api.stackexchange.com' 

    def initialize(service, page, user = nil) 
    @user = user 
    @options = { query: {site: service, page: page} } 
    end 

    def questions 
    self.class.get("/2.2/questions", @options) 
    end 

    def users 
    self.class.get("/2.2/users", @options) 
    end 
end 

Или, если вам нужно вызвать внешнюю службу и, например, создать несколько моделей с данными в сервисном объекте:

class SomeService 
    def initialize(user, client: SomeClient) 
    @user = user 
    @client = client # for mocking 
    end 

    def call 
    response = @client.get('/foo') 
    response.each do |d| 
     @user.baz << d[:woo] 
    end 
    end 
end 

SomeService.new(current_user).call 
+0

Я понимаю это. Это особый случай. Это не перенаправленный контроллер. Это больше класс, который я использую, когда я делаю вызов другого ресурса вне приложения в службу REST API. – user1570144

+0

Затем вы хотите сделать его сервисным объектом и передать ему текущего пользователя - не наследуйте его от ApplicationController. Контроллерам необходимо передать запрос, а ENV - работать. https://blog.engineyard.com/2014/keeping-your-rails-controllers-dry-with-services – max

+0

Вы пытались сделать этот класс контроллером, но просто не имеете никаких маршрутов к нему? – Kevin

0

Я решил это, переместив свой код в модуль в каталоге lib. Работает как шарм

Смежные вопросы