Приложение Rails, развернутое из Cloud9 через git в Heroku, не отображает экран входа в систему

Я настроил простую авторизацию в приложении Rails 5 в Cloud9, следуя этой сути https://github.com/equivalent/scrapbook2/blob/master/archive/blogs/2016-09-simple-ralis-authentication-for-one-user.md

он отлично работает в Cloud9, но когда я развертываю его в Heroku, вместо экрана входа в систему я получаю ошибку 404.

В адресной строке отображается правильный адрес:

https://phone-storage-app.herokuapp.com/login

но меня перенаправляют на стандартную страницу rails 404, говоря, что страница, которую я ищу, не существует.

тот же результат, если я попытаюсь:

https://phone-storage-app.herokuapp.com/sessions/new

С самого начала перейдите на https://phone-storage-app.herokuapp.com. Журналы Heroku показывают:

heroku[router]: at=info method=GET path="/" host=phone-storage-app.herokuapp.com request_id=23217153-3c94-483d-957d-c3b70e9212b7 fwd="91.215.176.16" dyno=web.1 connect=2ms service=76ms status=302 bytes=900
heroku[router]: at=info method=GET path="/login" host=phone-storage-app.herokuapp.com request_id=cd28c3ff-2b00-4774-b3a5-8230d758e7d4 fwd="91.215.176.16" dyno=web.1 connect=1ms service=147ms status=404 bytes=1750

Переменные среды установлены правильно, так как соединение AWS S3 работает отлично, как только я удаляю авторизацию.

Пробовал предварительно компилировать активы - тот же результат.

Работаю уже 3 дня, буду ОЧЕНЬ признателен за любые идеи!

Приложение должно быть очень легким, поэтому Devise и другие механизмы аутентификации не будут предпочтительным путем.

модели /site_user.rb

class SiteUser
 include ActiveModel::Model
 attr_accessor :username, :password
 def login_valid?
   username == ENV['ADMIN_USERNAME'] && password == ENV['ADMIN_PASS']
 end
end

контроллеры/session_controller.rb

class SessionsController < ApplicationController

   def new
     @site_user = SiteUser.new
   end

   def create
    sleep 2
    site_user_params = params.require(:site_user)

    @site_user = SiteUser.new
     .tap { |su| su.username = site_user_params[:username] }
     .tap { |su| su.password = site_user_params[:password] }

    if @site_user.login_valid?
      session[:current_user] = true
      flash[:notice] = 'Welcome back!'
      redirect_to '/contacts'
    else
      @site_user.password = nil
      flash[:error] = 'Sorry, wrong credentils'
      render 'new'
    end
  end

  def destroy
    reset_session
    redirect_to root_path
  end
end

контроллеры/application_controller.rb

class ApplicationController < ActionController::Base
 add_flash_types :notice, :error
 protect_from_forgery with: :exception
 ApplicationNotAuthenticated = Class.new(Exception)
 rescue_from ApplicationNotAuthenticated do
   respond_to do |format|
    format.json { render json: { errors: [message: "401 Not Authorized"] }, status: 401 }
    format.html do
       flash[:error] = "You are not authorized to access this page, please log in"
       redirect_to '/login'
    end
     format.any { head 401 }
   end
 end

  def authentication_required!
    session[:current_user] || raise(ApplicationNotAuthenticated)
  end
end

Пробовал переключиться на наследование StandardError:

ApplicationNotAuthenticated = Class.new(StandardError)

проблема сохраняется.

маршруты.rb

Rails.application.routes.draw do
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  get 'lists/index'
  resources :lists

  get 'contacts/index'
  get 'contacts/download'
  get 'contacts/create_list'
  get 'contacts/search'
  get 'contacts/process_file'
  resources :contacts do
   collection do
    post 'process_file'
    post 'save_list'
    post 'load_to_s3'
    get 'search'
    post 'create_list'
   end
  end

    root to: "contacts#index"
 end

просмотры/сеансы/new.html.rb

<div style="margin-top:70px">
  <section>
   <%= form_for(:site_user, url: login_path) do |f| %>
    <div>
      <%= f.label :username %>
      <%= f.text_field :username %>
    </div>
    <div>
      <%= f.label :password %>
      <%= f.password_field :password %>
    </div>
    <br />
    <div>
      <%= f.submit 'Log in' %>
    </div>
  <% end %>
 </section>
</div>

ОБНОВЛЕНИЕ 1

Установлен гем traceroute. Ниже приведены результаты его запуска:

Облако 9

Unused routes (9):
contacts#create
contacts#new
contacts#edit
contacts#show
contacts#update
contacts#update
sessions#new
sessions#create
sessions#destroy

Героку

Unused routes (6):
contacts#create
contacts#new
contacts#edit
contacts#show
contacts#update
contacts#update

Забыв о неиспользуемых маршрутах, он говорит мне, что на Heroku есть какая-то проблема с маршрутизацией. Может ли это быть связано с тем, что существует модель SiteUser без контроллера и SessionsController без модели? Или это какой-то баг, о котором никто не знает?

ОБНОВЛЕНИЕ 2

Запустил приложение на Heroku в режиме «разработки». Совсем запутался! Получение «Ошибка маршрутизации неинициализированной константы SessionsController». Пока маршруты явно правильные.

Ошибка маршрутизации

Запустил приложение в Cloud9 в «производственном» режиме. Все работает отлично.


person Pets    schedule 23.02.2017    source источник


Ответы (1)


У меня ушло 4 дня, но проблема была довольно неожиданной. Git не синхронизировал необходимые файлы контроллера.

$ git commit -am "commit 4"
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
    app/assets/javascripts/sessions.coffee
    app/assets/stylesheets/sessions.scss
    app/controllers/sessions_controller.rb
    app/helpers/sessions_helper.rb
    app/models/site_user.rb
    app/views/sessions/
    db/migrate/20170224183940_create_site_users.rb
    test/controllers/sessions_controller_test.rb
    test/fixtures/site_users.yml
    test/models/site_user_test.rb

nothing added to commit but untracked files present

Решение было запустить $ git add .

А затем просто зафиксируйте, как обычно.

person Pets    schedule 25.02.2017