Я попробовал первое решение, но не смог заставить его работать. После долгих поисков я обнаружил, что в Omniauth есть опция ": setup => true", которая позволяет динамически устанавливать аргументы, такие как опция: display, необходимая для Facebook OAuth.
Сначала включите опцию: setup.
config.omniauth :facebook, APP_CONFIG["fb_app_id"], APP_CONFIG["fb_app_secret"],
{:scope => 'email, offline_access', :setup => true}
Затем добавьте второй маршрут (настройка маршрута):
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } do
get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru'
get '/users/auth/:provider/setup' => 'users/omniauth_callbacks#setup'
end
Добавьте этот контроллер. Возможно, он у вас уже есть, если вы следовали руководству по разработке.
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def setup
request.env['omniauth.strategy'].options[:display] = mobile_device? ? "touch" : "page"
render :text => "Setup complete.", :status => 404
end
end
Добавьте этот метод в свой ApplicationController:
def mobile_device?
if session[:mobile_param]
session[:mobile_param] == "1"
else
request.user_agent =~ /Mobile|webOS/
end
end
Готово!