访问另一个控制器中的current_user变量

时间:2016-05-18 23:14:19

标签: ruby-on-rails ruby ruby-on-rails-4 devise

我正在尝试在另一个控制器的新实例中访问Devise的current_user变量。这是我对GetsInterfaceController的定义

$("p").css({'font-size': '40px'});

然后我在ClientsController

中实例化一个新的GetsInterfaceController实例
class GetsInterfaceController < ApplicationController
  def select_current_signed_in_user
   @signed_in_user_here = current_user
  end
end

但是当我尝试这个时,我在GetsInterfaceController中的@signed_in_user_here = current_user行上得到null错误。无论如何从GetsInterfaceController里面获取current_user属性?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我通过将代码移动到lib目录中的Module来解决这个问题。像魅力一样工作