Передать devise current_user методу в файле библиотеки

#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. Не уверен, проверяются ли вещи в библиотеке на предмет изменений файлов при разработке так же, как вещи в приложении