#ruby-on-rails #twitter #twitter-oauth #omniauth
#ruby-on-rails #Twitter #twitter-oauth #omniauth
Вопрос:
Я пытаюсь передать devise @current_user из моего application_controller в метод класса в файле библиотеки. Это делается для использования API Twitter. Я могу заставить его работать, написав различные методы twitter в файле application_controller, но мне было интересно, как я это сделаю, используя отдельную библиотеку. файл и класс вместо этого? Код выглядит следующим образом:
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 %>
Комментарии:
1. Извините, для новичка это непонятно — не могли бы вы предоставить какой-нибудь код, чтобы помочь мне, пожалуйста? Приветствия.
Ответ №1:
Я бы создал экземпляр класса, а не использовал методы класса.
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 %>
Комментарии:
1. Спасибо за ответ — я не могу заставить это работать, я боюсь, что это приводит к множеству ошибок rails с неопределенными методами. Можете ли вы уточнить, означает ли «в вашем контроллере» контроллер приложения? Когда я добавляю это к этому и запускаю его, ошибка
undefined method "our_public_tweets" for nil:NilClass
2. Какой бы контроллер вы ни использовали для их отображения в представлении
3. У меня есть индексная страница в WelcomeController, поэтому я добавил следующий код в WelcomeController и получил неинициализированную постоянную ошибку в WelcomeController для user_twitter: класс WelcomeController <ApplicationController def index @user_twitter = UserTwitter.new(current_user) end end
4. хм, я перезапустил сервер rails, и, похоже, он работает. Почему для активации требуется перезапуск? Приветствия, хотя, очень признателен!
5. Не уверен, проверяются ли вещи в библиотеке на предмет изменений файлов при разработке так же, как вещи в приложении