Rails 3 - Devise перенаправляет на форму после sign_in

В приложении для блога я хочу, чтобы каждый пользователь имел доступ к форме для публикации комментария.

Когда пользователь отправляет форму комментария, он перенаправляется на форму входа Devise, если он не вошел в систему.

before_filter :authenticate_user!, :except => [:index, :show, :new]

Как я могу после того, как пользователь войдет в систему, перенаправить его на форму комментария и заполнить все поля?

заранее спасибо


person invaino    schedule 18.04.2011    source источник


Ответы (2)


Если вы хотите, чтобы пользователь оставлял комментарии после каждого входа в систему, добавьте в ApplicationController:

#after_sign_in_path_for is called by devise
def after_sign_in_path_for(resource_or_scope)
  comment_path...
end

Если вы хотите вернуть пользователя на страницу, на которой он был до входа в систему, вы можете сохранить текущий контроллер + действие в сеансе и перенаправить обратно:

session[:pre_login_controller] = params[:controller]
session[:pre_login_action] = params[:action]

А потом :

def after_sign_in_path_for(resource_or_scope)
  if session[:pre_login_controller] && session[:pre_login_action]
    "#{session[:pre_login_controller]}/#{session[:pre_login_action]}"
  else
     some default path -- root url or comment path etc
  end
end
person Zabba    schedule 18.04.2011
comment
Я смешал ваше решение и Warden::Manager.before_failure, и все отлично работает! - person invaino; 20.04.2011

В Stack Overflow выделено несколько решений для перенаправления на предыдущий URL-адрес после входа в Devise.

Это, пожалуй, самое логичное решение, а также есть решение, включающее CanCan (которое я и рекомендую использовать)

Rails: Warden/Devise - Как захватить URL перед входом/неудачным доступом

Что касается заполнения форм, я думаю, что простым решением было бы в первую очередь ограничить поле для комментариев. Проверьте, вошел ли пользователь в систему (я думаю, что в Devise это user_signed_in?) и если user_signed_in? else "Вы должны войти в систему link_to, чтобы комментировать". Если у вас есть комментарии в действии, таком как #new, вы можете ограничить все новое действие с помощью devise. Для этого избавьтесь от вашего :new в аутентификации «кроме».

person a3uge    schedule 18.04.2011