Перегрузка метода класса модуля Rails в .irbrc - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть приложение Rails 3 с докладчиком, которое живет в lib. Соответствующая часть выглядит так:

lib/channels/channel.rb:

module Channels
  class Channel
    def current_user
      ApplicationController.current_controller.try(:current_or_guest_user)
    end

    def self.find_by_key(key)
      @@channels.find { |c| c.key == key.to_sym }
    end

    private

    def self.class_initialize
      @@channels = []
      Dir.glob("#{Rails.root}/lib/channels/channel_defs/*.rb").each do |f|
        require_dependency f
        @@channels << "Channels::#{File.basename(f, '.rb').camelize}".constantize.new
      end
    end

    class_initialize
  end
end

lib/channels/channel_defs/activity.rb

module Channels
  class Activity

    def current_user
      ApplicationController.current_controller.try(:current_or_guest_user)
    end

    def accessible?
      current_user.registered_user?
    end
  end
end

ApplicationController.current_controller является хаком, поэтому наш докладчик может получить помощь; мы установили его на self в before_filter. Это, конечно, не работает в консоли, и я хочу иметь возможность работать с Channel.accessible? в консоли, поэтому я попытался переопределить метод, как в .irbrc:

module Channels
  class Channel
    class << self
      puts "in irbrc"
      def current_user
        User.find(475)
      end
    end
  end
end

И, кажется, работает, когда вызывается напрямую:

ruby-1.9.2-p290: 002> Channels :: Channel.current_user => #

Но не при вызове с самого канала:

Channels::Channel.find_by_key(:activity).accessible?NoMethodError: undefined method `registered_user?' for nil:NilClass
    from /Users/jay/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/active_support/whiny_nil.rb:48:in `method_missing'
    from /Users/jay/src/tiptap/2t2/lib/channels/channel_defs/activity.rb:16:in `accessible?'
    from (irb):1

Вероятно, это либо что-то о собственном классе против класса, либо что-то о времени загрузки Channels :: Channel. Я пытался добавить require channels/channel в .irbrc, прежде чем мы снова откроем класс, но это не делает ... идеи?

1 Ответ

0 голосов
/ 29 сентября 2011

В режиме development классы модели определяются как временные копии и переопределяются на reload!, что может сделать такие расширения ненадежными или неэффективными.какой-то вариант конфигурации.Например:

def current_user
  ENV['USER_ID'] ? User.find(ENV['USER_ID']) : ApplicationController.current_controller.try(:current_or_guest_user)
end

Таким образом, вы можете запустить любого пользователя, которого захотите:

USER_ID=475 rails console
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...