Разработка + всенаправленная задача маршрутизации на Heroku - PullRequest
0 голосов
/ 23 сентября 2011

Я потянул свои волосы часами на этом ... У меня есть настройка Devise и omniauth, которая позволяет пользователям входить в систему со своими учетными записями Facebook. Я использую следующие версии драгоценных камней:

Installing devise (1.4.7)
Installing oauth2 (0.4.1)
Installing oa-oauth (0.2.6)
Installing omniauth (0.2.6)

среди прочих, у меня есть идентификатор приложения и секрет в моем инициализаторе Devise:

config.omniauth :facebook, 'app_id', 'app_secret',
          {:scope => 'email, offline_access', :client_options => {:ssl => {:verify => false}}}

Хотя я тоже безуспешно пытался:

config.omniauth :facebook, 'app_id', 'app_secret',
          # {:scope => 'email, offline_access', :client_options => {:ssl => {:ca_file => '/usr/lib/ssl/certs/ca-certificates.crt'}}}

У меня есть директива: omniauthable в моей пользовательской модели, и я определяю свой собственный контроллер обратного вызова в файле маршрутов:

devise_for :users, :controllers => { :omniauth_callbacks => 'user/authentications', :registrations => 'registrations' }

root :to => 'pages#home'

И я тоже безуспешно пытался добавить это в файл маршрутов:

get '/users/auth/:provider' => 'user/authentications#passthru'

Вот мой контроллер аутентификации:

class AuthenticationsController < Devise::OmniauthCallbacksController
  def index
    @authentications = current_user.authentications if current_user
  end

  def facebook
    omniauth = request.env["omniauth.auth"]
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
    if authentication
      flash[:notice] = "Signed in successfully."
      sign_in_and_redirect(:user, authentication.user)
    elsif current_user
      current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'])
      flash[:notice] = "Authentication successful."
      redirect_to authentications_url
    else
      user = User.new
      user.apply_omniauth(omniauth)
      if user.save
        flash[:notice] = "Signed in successfully."
        sign_in_and_redirect(:user, user)
      else
        session[:omniauth] = omniauth.except('extra')
        redirect_to new_user_registration_url
      end
    end
  end

  def passthru
    render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
  end

  def destroy
    @authentication = current_user.authentications.find(params[:id])
    @authentication.destroy
    flash[:notice] = "Successfully destroyed authentication."
    redirect_to authentications_url
  end
end

И моя учетная запись на Facebook:

<% = link_to image_tag ('/ assets / facebook_32.png'), omniauth_authorize_path (resource_name,: facebook)%>

Все это прекрасно работает локально, но если я попытаюсь войти в систему со своей учетной записью Facebook, когда мое приложение развернуто в Heroku, я получу в своем журнале следующее, и я попаду на страницу 404:

2011-09-23T03:26:31+00:00 app[web.1]: ActionController::RoutingError (uninitiali
zed constant User::AuthenticationsController):

Я попытался сбросить базу данных, но это тоже не помогло.

Вот мои маршруты из Heroku:

        new_user_session GET    /users/sign_in(.:format)               {:action=
>"new", :controller=>"devise/sessions"}
            user_session POST   /users/sign_in(.:format)               {:action=
>"create", :controller=>"devise/sessions"}
    destroy_user_session GET    /users/sign_out(.:format)              {:action=
>"destroy", :controller=>"devise/sessions"}
  user_omniauth_callback        /users/auth/:action/callback(.:format) {:action=
>/facebook/, :controller=>"user/authentications"}
           user_password POST   /users/password(.:format)              {:action=
>"create", :controller=>"devise/passwords"}
       new_user_password GET    /users/password/new(.:format)          {:action=
>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /users/password/edit(.:format)         {:action=
>"edit", :controller=>"devise/passwords"}
                         PUT    /users/password(.:format)              {:action=
>"update", :controller=>"devise/passwords"}
cancel_user_registration GET    /users/cancel(.:format)                {:action=
>"cancel", :controller=>"registrations"}
       user_registration POST   /users(.:format)                       {:action=
>"create", :controller=>"registrations"}
   new_user_registration GET    /users/sign_up(.:format)               {:action=
>"new", :controller=>"registrations"}
  edit_user_registration GET    /users/edit(.:format)                  {:action=
>"edit", :controller=>"registrations"}
                         PUT    /users(.:format)                       {:action=
>"update", :controller=>"registrations"}
                         DELETE /users(.:format)                       {:action=
>"destroy", :controller=>"registrations"}
                    root        /                                      {:control
ler=>"pages", :action=>"home"}

Любая помощь очень ценится. Пожалуйста, дайте мне знать, если вам нужна другая информация. Я знаю, что это что-то маленькое, но я чувствую, что пробовал тысячу разных вещей, и ничего не помогло.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2011

Я закончил тем, что изменил

devise_for :users, :controllers => { :omniauth_callbacks => 'user/authentications', :registrations => 'registrations' }

до

devise_for :users, :controllers => { :omniauth_callbacks => 'authentications', :registrations => 'registrations' }

и он начал работать как локально, так и на Heroku.

0 голосов
/ 23 сентября 2011

Я думаю, ваша строка authenicatine должна использовать find_or_create.

authentication = Authentication.find_or_create_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
...