将 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 %>
我正在尝试将设计 @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 %>