Ошибка миграции БД с приложением Rails на Heroku (не удается найти идентификатор пользователя) - PullRequest
0 голосов
/ 23 мая 2019

извиняюсь, если об этом уже спрашивали. С моим приложением rails все отлично работает в процессе разработки, но при переходе на Heroku я сталкиваюсь с проблемой, когда он пытается найти пользователя с идентификатором '1', но база данных пуста. Я перенес, сбросил и посеял базу данных, но все еще получаю ошибку из журналов Heroku.

Кажется, проблема в том, что мой _userportal частично встроен в файл article / index.html.erb, который вызывает current_user и logged_in? методы из ApplicationController.

Кажется, что ответ должен появиться у меня, как это должно быть связано с поиском User.find (session [: user_id]). Вернее, база данных не была должным образом сброшена после того, как ее подтолкнули к героку. В консоли heroku rails значение User.count равно 0, но приложение пытается найти пользователя с идентификатором «1». Я не уверен, почему это так.

Из логов героки:

2019-05-23T00:02:43.803680+00:00 app[web.1]: [fe18170f-fab4-4495-8fe2-b2502762afb9]   Rendered articles/index.html.erb within layouts/application (8.5ms)
2019-05-23T00:02:43.803865+00:00 app[web.1]: [fe18170f-fab4-4495-8fe2-b2502762afb9] Completed 500 Internal Server Error in 10ms (ActiveRecord: 2.0ms)
2019-05-23T00:02:43.805254+00:00 app[web.1]: [fe18170f-fab4-4495-8fe2-b2502762afb9]   
2019-05-23T00:02:43.805305+00:00 app[web.1]: [fe18170f-fab4-4495-8fe2-b2502762afb9] ActiveRecord::RecordNotFound (Couldn't find User with 'id'=1):
2019-05-23T00:02:43.805348+00:00 app[web.1]: [fe18170f-fab4-4495-8fe2-b2502762afb9]   
2019-05-23T00:02:43.805403+00:00 app[web.1]: [fe18170f-fab4-4495-8fe2-b2502762afb9] app/controllers/application_controller.rb:4:in `current_user'
2019-05-23T00:02:43.805405+00:00 app[web.1]: [fe18170f-fab4-4495-8fe2-b2502762afb9] app/controllers/application_controller.rb:11:in `logged_in?'

ApplicationController.rb:

def current_user
    if session[:user_id]
        @current_user ||= User.find(session[:user_id])
    else
        @current_user = nil
    end
end

def logged_in?
    !!current_user
end

_userportal.html.erb:

<div class="container">
    <div class="userportal">
        <div class="sessionsection">
            <% if logged_in? %>
                Logged in as <%= current_user.username %>.
                <br>
                <br>
                <%= button_to 'Log Out', logout_path, method: :delete, class: "btn btn-xs btn-danger" %>
            <% else %>
                <%= link_to 'Sign Up', signup_path %> or 
                <%= link_to 'Log In', login_path %>
            <% end %>
        </div>
        <hr>
        <div class="actionsection">
            <%= link_to 'Create a post', current_user ? post_path : signup_path %>
            <hr>
            <%= link_to 'See All Posts', blog_path %>
        </div>
    </div>
</div>

Консоль Heroku:

irb(main):005:0> User.count
   (1.7ms)  SELECT COUNT(*) FROM "users"
=> 0

Heroku должен сделать current_user равным nil и не войти в систему правильно?

Спасибо всем, кто выручил! Пожалуйста, сообщите, если я должен предоставить больше кода / информации.

ОБНОВЛЕНИЕ:

Исправление было в методе current_user. Изменение:

@current_user ||= User.find(session[:user_id])

до:

@current_user ||= User.find_by(id: session[:user_id])

Работали!

1 Ответ

1 голос
/ 23 мая 2019

Просто используйте find_by(id: val), чтобы он возвратил nil вместо исключения.

def current_user
    if session[:user_id]
        @current_user ||= User.find_by(id: session[:user_id])
    else
        @current_user = nil
    end
end

При этом current_user будет nil, если идентификатор пользователя в сеансе не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...