将 devise current_user 传递给 lib 文件中的方法

Pass devise current_user to a method in a lib file

我正在尝试将设计 @current_user 从我的 application_controller 传递到库文件中的 class 方法。这是要使用推特API。我可以通过在 application_controller 文件中编写各种 twitter 方法来使其工作,但我想知道如何使用单独的库来完成它。文件和 class 代替?代码如下:

lib/twitter_api.rb

class TwitterApi

def self.our_public_tweets
  client.user_timeline('BBCNews', count: 1, exclude_replies: true, include_rts: false)
end

def self.followers
  client.followers.take(5)
end

def self.client
  @client ||= Twitter::REST::Client.new do |config|
   config.consumer_key        = Rails.application.secrets.twitter_api_key
   config.consumer_secret     = Rails.application.secrets.twitter_api_secret
   config.access_token        = current_user.token
   config.access_token_secret = current_user.secret
    end
  end
end

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end

查看文件:index.html.erb

  <%= TwitterApi.our_public_tweets.each do |tweet| %>
    <%= tweet.text %>
  <% end %>

  <%= TwitterApi.followers.each do |follower| %>
    <%= follower.name %>
  <% end %>

我会创建 class 的实例,而不是使用 class 方法。

class UserTwitter
  def initialize(user)
    @user = user
  end

  def our_public_tweets
    client.user_timeline('BBCNews', count: 1, exclude_replies: true, include_rts: false)
  end

  def followers
    client.followers.take(5)
  end

  private

  attr_reader :user

  def client
    @client ||= Twitter::REST::Client.new do |config|
      config.consumer_key = Rails.application.secrets.twitter_api_key
      config.consumer_secret = Rails.application.secrets.twitter_api_secret
      config.access_token = user.token
      config.access_token_secret = user.secret
    end
  end
end

然后在你的控制器中

def index
  @user_twitter = UserTwitter.new(current_user)
end

这在你看来就是

<% @user_twitter.our_public_tweets.each do |tweet| %>
  <%= tweet.text %>
<% end %>

<% @user_twitter.followers.each do |follower| %>
  <%= follower.name %>
<% end %>