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