2016-07-13 117 views
5

Ho un problema molto strano su heroku. Ho visto che assomiglia a questo:ActionView :: Template :: Errore (metodo non definito `silence 'per)

= content_for :header_title do 
    = t('.header_title') 

- if @appointments.exists? 
    %table.table.table-striped.table-bordered.table-hover 
    %thead 
     %tr 
     %th= t('.id') 
     %th= t('.athena_health_id') 
     %th= t('.start_time') 
     %th= t('.duration') 
     %th= t('.provider') 
     %th= t('.created_at') 
     %th= t('.updated_at') 
    %tbody 
     = render @appointments 

    = paginate @appointments 
- else 
    %h3.text-center= t('.appointments_not_found') 
%hr/ 

Niente di speciale. Quando visito la pagina che utilizza questo modello su heroku, ricevo:

ActionView::Template::Error (undefined method `silence' for #<Logger:0x007f7a86267a70>): 

Le specifiche stanno passando. Sul mio locale tutto funziona bene. Non so cosa sta succedendo. Stacktrace sta mostrando che il problema sta seguendo la linea:

= paginate @appointments 

sto usando Rails 5.0 e kaminari (1.0.0.alpha). Qualche idea?

Edit: Nel mio production.rb ho:

if ENV['RAILS_LOG_TO_STDOUT'].present? 
    config.logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT)) 
    end 

config.log_formatter = ::Logger::Formatter.new 
+1

L'errore sembra incapace trovare il metodo "silence" per una classe chiamata 'Logger'. Il tuo codice ha una classe 'Logger' o è quella alla fine di Heroku? – Okomikeruko

+0

No, la mia classe non ha una classe di logger. In production.rb ho anche: se ENV ['RAILS_LOG_TO_STDOUT']. Presente? config.logger = ActiveSupport :: TaggedLogging.new (Logger.new (STDOUT)) fine config.log_formatter = :: :: Logger Formatter.new –

+1

Non avete visto [questo] (https: // GitHub. com/rails/rails/issues/20492) problema su github? Il metodo 'silence' della classe' :: Logger' è stato deprecato da Rails4.2 ed è stato rimosso da Rails5. – NickGnd

risposta

7

In Rails5 silence metodo è stato rimosso dalla classe ::Logger di base (si veda questo issue)

Così, invece di passare un'istanza ::Logger, prova a passare un'istanza ActiveSupport::Logger che espone il metodo silence (vedi documentation), in questo modo:

config.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT))

nota: ActiveSupport::Logger ereditano dalla classe ::Logger di base e includono moduli LoggerSilence (vedi documentation)

Un esempio dal mio rails console (rails5 e ruby2.3.0)

logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT)) 
=> #<Logger:0x007f890b8a3d10 @progname=nil, @level=0, @default_formatter=#<Logger::Formatter:0x007f890b8a2cd0 @datetime_format=nil>, @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x007f890b8a26e0 @datetime_format=nil>, @logdev=#<Logger::LogDevice:0x007f890b8a2870 @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#<IO:<STDOUT>>, @mon_owner=nil, @mon_count=0, @mon_mutex=#<Thread::Mutex:0x007f890b8a2730>>> 
logger.silence 
NoMethodError: undefined method `silence' for #<Logger:0x007f890b8a3d10> 
# ... 

logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) 
=> #<ActiveSupport::Logger:0x007f890bd2a028 @progname=nil, @level=0, @default_formatter=#<Logger::Formatter:0x007f890bd29fb0 @datetime_format=nil>, @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x007f890bd29f10 @datetime_format=nil>, @logdev=#<Logger::LogDevice:0x007f890bd29f60 @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#<IO:<STDOUT>>, @mon_owner=nil, @mon_count=0, @mon_mutex=#<Thread::Mutex:0x007f890bd29f38>>, @local_levels=#<Concurrent::Map:0x007f890bd29ec0 entries=0 default_proc=nil>> 
logger.silence 
LocalJumpError: no block given (yield) 
# The method exists, but I don't pass any block 
+0

Risposta perfetta. –