2016-03-19 2 views
0

Ядро моего приложения построено с Michael Hartl's rails tutorial. Недавно я сменил User DB, так что столбец name имеет имя username, а также добавил в friendly_id для более красивых URL-адресов. Я обновлялся везде, где мог найти в соответствии с этими изменениями, и все работает плавно, за исключением дружественной пересылки после входа пользователя в систему. если пользователь, не зарегистрированный пользователем, посещает страницу редактирования пользователя, они попадают на страницу входа в систему, после входа в систему они должны быть отправлены на страницу редактирования. Но вместо этого он просто регистрирует их и остается на странице входа.Дружественная переадресация после входа в систему не работает после добавления friendly_id в модель пользователя

Я не могу видеть где-нибудь, что нужно бы изменения, так что снова работает и от того, что я могу видеть, он должен работать

контроллер сеанса

def create 
    user = User.find_by(email: params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
     log_in user 
     params[:session][:remember_me] == '1' ? remember(user) : forget(user) 
     redirect_back_or user 
    else 
     flash.now[:danger] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 

контроллера пользователя

before_action :correct_user, only: [:edit, :update] 
before_action :logged_in_user, only: [:edit, :update] 

def edit 
end 

private 


    # Confirms a logged-in user. 
    def logged_in_user 
     unless logged_in? 
     store_location 
     flash[:danger] = "Please log in." 
     redirect_to login_url 
     end 
    end 


    def correct_user 
     @user = User.friendly.find(params[:id]) 
     redirect_to(root_url) unless current_user?(@user) 
    end 

прикладной контроллер

def redirect_back_or(path) 
    redirect_to request.referer || path 
end 



    private 

    # Confirms a logged-in user. 
    def logged_in_user 
     unless logged_in? 
     store_location 
     flash[:danger] = "You gotta login first!" 
     redirect_to login_url 
     end 
    end 

сессия помощник

# Redirects to stored location (or to the default). 
    def redirect_back_or(default) 
    redirect_to(session[:forwarding_url] || default) 
    session.delete(:forwarding_url) 
    end 

    # Stores the URL trying to be accessed. 
    def store_location 
    session[:forwarding_url] = request.url if request.get? 
    end 

Каждый знает, где эта проблема может лежать?

Update

после беседы с @vishal перенаправления осуществляются от контроллера приложения redirect_back_or метода

def redirect_back_or(path) 
    redirect_to request.referer || path 
end 

Если изменить его

def redirect_back_or(path) 
    redirect_to root_path || path 
end 

Я доставлен в корневой путь, поэтому я знаю эту строку, скорее всего, виновницу.

Промежуток он работает и не работает Я добавил mailboxer камень для личных сообщений, изменил пользователям БД name к username и добавил friendly_id в username колонке. Возможно, что-то может выделиться из-за вас, потому что он перестает работать.

+0

У вас есть 'before_action: logged_in_user' в вашем UserController? 'Store_location' вызывается только в' logged_in_user', который, похоже, не был добавлен как фильтр before. – Vishal

+0

@ Вишал забыл добавить его.Я обновил вопрос сейчас – Rob

+0

Можете ли вы включить свой метод 'store_location'? – Vishal

ответ

1

В вашем контроллере приложений измените метод redirect_back_or (path) на это.

def redirect_back_or(path) 
     redirect_to session[:forwarding_url] || path 
     session.delete(:forwarding_url) 
    end 

redirect_to request.referer Вы были до того, который был ответственен за перенаправление к последнему URL, то есть, LOGIN_URL.

Я понятия не имею, почему вы определяете два разных метода: 1 в ApplicationController & 1 в SessionsHelper - с тем же именем, но с разными намерениями.

+1

Кроме того, в руководстве по рельсам Michael Hartl, которое вы упомянули, это 'request.referrer', а не' request.referer'. Не знаю, имеет ли это какое-либо значение, а просто помещает его туда. – Vishal

+0

Да, это так. Глядя на мою историю фиксации, я, должно быть, был в режиме робота при реализации почтового ящика почтового ящика и добавил метод «redirect_back_or (путь)» к контроллеру приложения. По какой-то причине я думал, что добавил это много лет назад, так что это было безответственно. Большое спасибо за Вашу помощь – Rob

Смежные вопросы