I have a strange problem with setting request.format = :mobile
I can reproduce this problem on a completely fresh Rails 3.0.7 app with no special gems. This seemed to work well in Rails 2 but for some reason is hiccuping here, not sure what's different in Rails 3 that makes this hiccup. If you look at the stack track, it doesn't even pass through my app stack once -- weird -- maybe this is a problem with Passenger? Anyone see anything i'm doing wrong here? Your tips are much appreciated, this is baffling me.
Step-by-step instructions to reproduce:
Totally fresh rails app (rails new test_mobile), then go delete public/ index.html
routes.rb __________________________________
TestMobile::Application.routes.draw do root :to => "application#welcome" end
application_controller.rb __________________________
class ApplicationController < ActionController::Base protect_from_forgery
def welcome render "welcome/index" end
before_filter :check_mobile
def check_mobile request.format = :mobile if request.env["HTTP_USER_AGENT"] =~ / iPhone/ end end
views/welcome/index.html.erb ______________________________________
this is my regular site
views/welcome/index.mobile.erb ____________________________________
this is my mobile site
That's it -- those are all the steps one needs to take to reproduce this, no gem configuration necessary.
Set it up with Passenger (as test-mobile.local), go to Safrai, load test-mobile.local, you get "this is my regular site". Then switch Develop > User Agent to "Safari iOS 4.1", reload the page, and bam:
NoMethodError in ApplicationsController#welcome
undefined method `ref' for nil:NilClass Rails.root: /Users/jason/Projects/DEVELOPMENT/ROR/test_mobile
Application Trace | Framework Trace | Full Trace activesupport (3.0.7) lib/active_support/whiny_nil.rb:48:in `method_missing' actionpack (3.0.7) lib/action_controller/metal/rendering.rb:10:in `process_action' actionpack (3.0.7) lib/action_controller/metal/rendering.rb:10:in `map' actionpack (3.0.7) lib/action_controller/metal/rendering.rb:10:in `process_action' actionpack (3.0.7) lib/abstract_controller/callbacks.rb:18:in `process_action' activesupport (3.0.7) lib/active_support/callbacks.rb:441:in `_run__2115867319__process_action__733682996__callbacks' activesupport (3.0.7) lib/active_support/callbacks.rb:410:in `send' activesupport (3.0.7) lib/active_support/callbacks.rb:410:in `_run_process_action_callbacks' activesupport (3.0.7) lib/active_support/callbacks.rb:94:in `send' activesupport (3.0.7) lib/active_support/callbacks.rb:94:in `run_callbacks' actionpack (3.0.7) lib/abstract_controller/callbacks.rb:17:in `process_action' actionpack (3.0.7) lib/action_controller/metal/instrumentation.rb: 30:in `process_action' activesupport (3.0.7) lib/active_support/notifications.rb:52:in `instrument' activesupport (3.0.7) lib/active_support/notifications/instrumenter.rb: 21:in `instrument' activesupport (3.0.7) lib/active_support/notifications.rb:52:in `instrument' actionpack (3.0.7) lib/action_controller/metal/instrumentation.rb: 29:in `process_action' actionpack (3.0.7) lib/action_controller/metal/rescue.rb:17:in `process_action' actionpack (3.0.7) lib/abstract_controller/base.rb:119:in `process' actionpack (3.0.7) lib/abstract_controller/rendering.rb:41:in `process' actionpack (3.0.7) lib/action_controller/metal.rb:138:in `dispatch' actionpack (3.0.7) lib/action_controller/metal/rack_delegation.rb: 14:in `dispatch' actionpack (3.0.7) lib/action_controller/metal.rb:178 actionpack (3.0.7) lib/action_dispatch/routing/route_set.rb:62:in `call' actionpack (3.0.7) lib/action_dispatch/routing/route_set.rb:62:in `dispatch' actionpack (3.0.7) lib/action_dispatch/routing/route_set.rb:27:in `call' rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in `call' rack-mount (0.6.14) lib/rack/mount/code_generation.rb:93:in `recognize' rack-mount (0.6.14) lib/rack/mount/code_generation.rb:68:in `optimized_each' rack-mount (0.6.14) lib/rack/mount/code_generation.rb:92:in `recognize' rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in `call' actionpack (3.0.7) lib/action_dispatch/routing/route_set.rb:493:in `call' actionpack (3.0.7) lib/action_dispatch/middleware/ best_standards_support.rb:17:in `call' actionpack (3.0.7) lib/action_dispatch/middleware/head.rb:14:in `call' rack (1.2.2) lib/rack/methodoverride.rb:24:in `call' actionpack (3.0.7) lib/action_dispatch/middleware/params_parser.rb: 21:in `call' actionpack (3.0.7) lib/action_dispatch/middleware/flash.rb:182:in `call' actionpack (3.0.7) lib/action_dispatch/middleware/session/ abstract_store.rb:149:in `call' actionpack (3.0.7) lib/action_dispatch/middleware/cookies.rb:302:in `call' activerecord (3.0.7) lib/active_record/query_cache.rb:32:in `call' activerecord (3.0.7) lib/active_record/connection_adapters/abstract/ query_cache.rb:28:in `cache' activerecord (3.0.7) lib/active_record/query_cache.rb:12:in `cache' activerecord (3.0.7) lib/active_record/query_cache.rb:31:in `call' activerecord (3.0.7) lib/active_record/connection_adapters/abstract/ connection_pool.rb:354:in `call' actionpack (3.0.7) lib/action_dispatch/middleware/callbacks.rb:46:in `call' activesupport (3.0.7) lib/active_support/callbacks.rb:416:in `_run_call_callbacks' actionpack (3.0.7) lib/action_dispatch/middleware/callbacks.rb:44:in `call' rack (1.2.2) lib/rack/sendfile.rb:107:in `call' actionpack (3.0.7) lib/action_dispatch/middleware/remote_ip.rb:48:in `call' actionpack (3.0.7) lib/action_dispatch/middleware/show_exceptions.rb: 47:in `call' railties (3.0.7) lib/rails/rack/logger.rb:13:in `call' rack (1.2.2) lib/rack/runtime.rb:17:in `call' activesupport (3.0.7) lib/active_support/cache/strategy/local_cache.rb: 72:in `call' rack (1.2.2) lib/rack/lock.rb:11:in `call' rack (1.2.2) lib/rack/lock.rb:11:in `synchronize' rack (1.2.2) lib/rack/lock.rb:11:in `call' actionpack (3.0.7) lib/action_dispatch/middleware/static.rb:30:in `call' railties (3.0.7) lib/rails/application.rb:168:in `call' railties (3.0.7) lib/rails/application.rb:77:in `send' railties (3.0.7) lib/rails/application.rb:77:in `method_missing' passenger (2.2.10) lib/phusion_passenger/rack/request_handler.rb:92:in `process_request' passenger (2.2.10) lib/phusion_passenger/abstract_request_handler.rb: 207:in `main_loop' passenger (2.2.10) lib/phusion_passenger/rack/application_spawner.rb: 118:in `run' passenger (2.2.10) lib/phusion_passenger/rack/application_spawner.rb: 65:in `spawn_application' passenger (2.2.10) lib/phusion_passenger/utils.rb:184:in `safe_fork' passenger (2.2.10) lib/phusion_passenger/rack/application_spawner.rb: 58:in `spawn_application' passenger (2.2.10) lib/phusion_passenger/rack/application_spawner.rb: 41:in `spawn_application' passenger (2.2.10) lib/phusion_passenger/spawn_manager.rb:159:in `spawn_application' passenger (2.2.10) lib/phusion_passenger/spawn_manager.rb:287:in `handle_spawn_application' passenger (2.2.10) lib/phusion_passenger/abstract_server.rb:352:in `__send__' passenger (2.2.10) lib/phusion_passenger/abstract_server.rb:352:in `main_loop' passenger (2.2.10) lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously' passenger (2.2.10) bin/passenger-spawn-server:61 Request
Parameters:
{"format"=>"mobile"} Show session dump
Show env dump
Response
Headers:
None