2011-05-29 13 views
16

Hace unos meses, seguí este tutorial. Todo funcionaba en Rails 3.0.x, pero en Rails 3.1 RC, me sale este error:flash.delete (: notice) no funciona en Rails 3.1 RC?

undefined method `gsub' for #<ActionDispatch::Flash::FlashHash:0x00000108338f20> 

¿Ha cambiado algo en Rails 3.1 RC con el objeto flash? Parece que el problema es con esta línea:

<%= escape_javascript(flash.delete(:notice)) %> 

traza completa:

actionpack (3.1.0.rc1) lib/action_view/helpers/javascript_helper.rb:21:in `escape_javascript' 
app/views/likes/create.js.erb:4:in `_app_views_likes_create_js_erb___2491329848991146022_2217047840' 
actionpack (3.1.0.rc1) lib/action_view/template.rb:144:in `block in render' 
activesupport (3.1.0.rc1) lib/active_support/notifications.rb:57:in `instrument' 
actionpack (3.1.0.rc1) lib/action_view/template.rb:142:in `render' 
actionpack (3.1.0.rc1) lib/action_view/renderer/template_renderer.rb:40:in `block (2 levels) in render_template' 
actionpack (3.1.0.rc1) lib/action_view/renderer/abstract_renderer.rb:33:in `block in instrument' 
activesupport (3.1.0.rc1) lib/active_support/notifications.rb:55:in `block in instrument' 
activesupport (3.1.0.rc1) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
activesupport (3.1.0.rc1) lib/active_support/notifications.rb:55:in `instrument' 
actionpack (3.1.0.rc1) lib/action_view/renderer/abstract_renderer.rb:33:in `instrument' 
actionpack (3.1.0.rc1) lib/action_view/renderer/template_renderer.rb:39:in `block in render_template' 
actionpack (3.1.0.rc1) lib/action_view/renderer/template_renderer.rb:47:in `render_with_layout' 
actionpack (3.1.0.rc1) lib/action_view/renderer/template_renderer.rb:38:in `render_template' 
actionpack (3.1.0.rc1) lib/action_view/renderer/template_renderer.rb:12:in `block in render' 
actionpack (3.1.0.rc1) lib/action_view/renderer/abstract_renderer.rb:22:in `wrap_formats' 
actionpack (3.1.0.rc1) lib/action_view/renderer/template_renderer.rb:9:in `render' 
actionpack (3.1.0.rc1) lib/action_view/renderer/renderer.rb:36:in `render_template' 
actionpack (3.1.0.rc1) lib/action_view/renderer/renderer.rb:17:in `render' 
actionpack (3.1.0.rc1) lib/abstract_controller/rendering.rb:120:in `_render_template' 
actionpack (3.1.0.rc1) lib/action_controller/metal/streaming.rb:258:in `_render_template' 
actionpack (3.1.0.rc1) lib/abstract_controller/rendering.rb:114:in `render_to_body' 
actionpack (3.1.0.rc1) lib/action_controller/metal/renderers.rb:30:in `render_to_body' 
actionpack (3.1.0.rc1) lib/action_controller/metal/compatibility.rb:43:in `render_to_body' 
actionpack (3.1.0.rc1) lib/abstract_controller/rendering.rb:99:in `render' 
actionpack (3.1.0.rc1) lib/action_controller/metal/rendering.rb:16:in `render' 
actionpack (3.1.0.rc1) lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render' 
activesupport (3.1.0.rc1) lib/active_support/core_ext/benchmark.rb:5:in `block in ms' 
/Users/Chris/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/benchmark.rb:309:in `realtime' 
activesupport (3.1.0.rc1) lib/active_support/core_ext/benchmark.rb:5:in `ms' 
actionpack (3.1.0.rc1) lib/action_controller/metal/instrumentation.rb:40:in `block in render' 
actionpack (3.1.0.rc1) lib/action_controller/metal/instrumentation.rb:78:in `cleanup_view_runtime' 
activerecord (3.1.0.rc1) lib/active_record/railties/controller_runtime.rb:24:in `cleanup_view_runtime' 
actionpack (3.1.0.rc1) lib/action_controller/metal/instrumentation.rb:39:in `render' 
actionpack (3.1.0.rc1) lib/action_controller/metal/implicit_render.rb:10:in `default_render' 
actionpack (3.1.0.rc1) lib/action_controller/metal/implicit_render.rb:5:in `send_action' 
actionpack (3.1.0.rc1) lib/abstract_controller/base.rb:167:in `process_action' 
actionpack (3.1.0.rc1) lib/action_controller/metal/rendering.rb:10:in `process_action' 
actionpack (3.1.0.rc1) lib/abstract_controller/callbacks.rb:18:in `block in process_action' 
activesupport (3.1.0.rc1) lib/active_support/callbacks.rb:452:in `_run__308249102964749222__process_action__3107984421769475816__callbacks' 
activesupport (3.1.0.rc1) lib/active_support/callbacks.rb:386:in `_run_process_action_callbacks' 
activesupport (3.1.0.rc1) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (3.1.0.rc1) lib/abstract_controller/callbacks.rb:17:in `process_action' 
actionpack (3.1.0.rc1) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action' 
activesupport (3.1.0.rc1) lib/active_support/notifications.rb:55:in `block in instrument' 
activesupport (3.1.0.rc1) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
activesupport (3.1.0.rc1) lib/active_support/notifications.rb:55:in `instrument' 
actionpack (3.1.0.rc1) lib/action_controller/metal/instrumentation.rb:29:in `process_action' 
actionpack (3.1.0.rc1) lib/action_controller/metal/params_wrapper.rb:202:in `process_action' 
actionpack (3.1.0.rc1) lib/action_controller/metal/rescue.rb:17:in `process_action' 
activerecord (3.1.0.rc1) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
actionpack (3.1.0.rc1) lib/abstract_controller/base.rb:121:in `process' 
actionpack (3.1.0.rc1) lib/abstract_controller/rendering.rb:45:in `process' 
actionpack (3.1.0.rc1) lib/action_controller/metal.rb:193:in `dispatch' 
actionpack (3.1.0.rc1) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch' 
actionpack (3.1.0.rc1) lib/action_controller/metal.rb:236:in `block in action' 
actionpack (3.1.0.rc1) lib/action_dispatch/routing/route_set.rb:65:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/routing/route_set.rb:65:in `dispatch' 
actionpack (3.1.0.rc1) lib/action_dispatch/routing/route_set.rb:29:in `call' 
rack-mount (0.8.1) lib/rack/mount/route_set.rb:152:in `block in call' 
rack-mount (0.8.1) lib/rack/mount/code_generation.rb:93:in `block in recognize' 
rack-mount (0.8.1) lib/rack/mount/code_generation.rb:82:in `optimized_each' 
rack-mount (0.8.1) lib/rack/mount/code_generation.rb:92:in `recognize' 
rack-mount (0.8.1) lib/rack/mount/route_set.rb:141:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/routing/route_set.rb:531:in `call' 
/Users/Chris/.rvm/gems/[email protected]/bundler/gems/omniauth-795d965b8961/oa-core/lib/omniauth/strategy.rb:44:in `call!' 
/Users/Chris/.rvm/gems/[email protected]/bundler/gems/omniauth-795d965b8961/oa-core/lib/omniauth/strategy.rb:30:in `call' 
warden (1.0.4) lib/warden/manager.rb:35:in `block in call' 
warden (1.0.4) lib/warden/manager.rb:34:in `catch' 
warden (1.0.4) lib/warden/manager.rb:34:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
rack (1.3.0) lib/rack/etag.rb:23:in `call' 
rack (1.3.0) lib/rack/conditionalget.rb:35:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/head.rb:14:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/params_parser.rb:21:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/flash.rb:243:in `call' 
rack (1.3.0) lib/rack/session/abstract/id.rb:195:in `context' 
rack (1.3.0) lib/rack/session/abstract/id.rb:190:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/cookies.rb:321:in `call' 
activerecord (3.1.0.rc1) lib/active_record/query_cache.rb:54:in `call' 
activerecord (3.1.0.rc1) lib/active_record/connection_adapters/abstract/connection_pool.rb:448:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
activesupport (3.1.0.rc1) lib/active_support/callbacks.rb:392:in `_run_call_callbacks' 
activesupport (3.1.0.rc1) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/callbacks.rb:28:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/reloader.rb:68:in `call' 
rack (1.3.0) lib/rack/sendfile.rb:102:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/remote_ip.rb:48:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/show_exceptions.rb:47:in `call' 
railties (3.1.0.rc1) lib/rails/rack/logger.rb:13:in `call' 
rack (1.3.0) lib/rack/methodoverride.rb:24:in `call' 
rack (1.3.0) lib/rack/runtime.rb:17:in `call' 
activesupport (3.1.0.rc1) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
rack (1.3.0) lib/rack/lock.rb:34:in `call' 
actionpack (3.1.0.rc1) lib/action_dispatch/middleware/static.rb:53:in `call' 
railties (3.1.0.rc1) lib/rails/rack/content_length.rb:16:in `call' 
railties (3.1.0.rc1) lib/rails/engine.rb:438:in `call' 
railties (3.1.0.rc1) lib/rails/rack/log_tailer.rb:14:in `call' 
rack (1.3.0) lib/rack/handler/webrick.rb:59:in `service' 
/Users/Chris/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service' 
/Users/Chris/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run' 
/Users/Chris/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread' 
+0

¿Cuál es el resultado de 'flash.delete (: notice) .class.name'? Con suerte, es 'String' y no' FlashHash'? Tal vez de alguna manera el 'flash' se incrustó en' flash [: notice] 'en sí mismo? – Zabba

+0

Hola Zabba, buena observación. flash.delete (: notice) .class.name devuelve ActionDispatch :: Flash :: FlashHash. ¿Esto es normal? –

+0

"puts flash [: notice]" devuelve el mensaje flash real en la consola/terminal de rieles. Así que no sé por qué esto no funciona en consecuencia –

Respuesta

23

El FlashHash ha cambiado entre 3.0.xy 3.1.x.

In Rails 3.0.x, FlashHash was derived from Hash. Por lo tanto, cuando llamó al delete, fue Hash 's delete llamado - que borra la clave especificada y devuelve el valor de la clave.

In Rails 3.1, FlashHash is not derived from Hash - incluye Enumerable. Y el FlashHash#delete está devolviendo self es decir FlashHash. Por lo tanto, su error.

Por qué el equipo de Rails necesitaba cambiar esto, me supera.

Creo que necesita una solución que funciona tanto en 3.0.x y 3,1:

escape_javascript(flash[:notice]) 
flash[:notice] = nil 
+6

Referencias increíbles! De leer esos enlaces, reuní en 3.1 flash.discard (: notice) parece funcionar como el mismo comportamiento para flash.delete (: notice) en Rails 3.0.X. –

+1

Creo que han cambiado esto debido al [principio de sustitución de Liskov] (http: //en.wikipedia.org/wiki/Liskov_substitution_principle). – rdvdijk

1

En los carriles 3, es más hacia un uso de la opción: aviso en redirect_to para el ajuste del aviso. Es posible que algunos de los métodos de flash hayan quedado obsoletos en 3.0. #, Y ahora se eliminen. No estoy seguro de cuál es la mejor solución, tal vez para establecerla en cero.

flash[:notice] = nil 

# in your view: 
<% if notice %> 
    <%= notice %> 
<% end %> 

Si está intentando configurar jQuery, ahora está predeterminado en 3.1.

+0

No estoy tratando de configurar el flash en la redirección. El mensaje flash ya se ha configurado. El problema es que no muestra el mensaje flash en create.js.erb –

+0

. Tal vez estoy malinterpretando. Pero estoy de acuerdo con el otro hilo de comentarios. Si solo quiere ver el aviso, use flash [: notice] en su vista. – agmcleod

15

Uso flash.discard(:notice)

(Cortesía cristiana, añadí esta solución para una mejor visibilidad)

Cuestiones relacionadas