Подтвердить что ты не робот

Перенаправление пользователя для регистрации

Используя before_action :authenticate_user!, чтобы проверить, зарегистрирован ли пользователь. Но он отправляет пользователей в login вместо signup.

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

Как я могу отправить пользователя для регистрации и перенаправить пользователя обратно на исходную страницу?

Попытки:

before_filter :auth_user

def auth_user
  redirect_to new_user_registration_url unless user_signed_in?
end

Файл маршрутов

Rails.application.routes.draw do
  devise_for :installs
  resources :orders
  resources :products
  devise_for :users

  get 'dashboard' => 'pages#dashboard'
  get 'contact' => 'pages#contact'
  get 'cart' => 'carts#index'

  root 'pages#home'
4b9b3361

Ответ 1

То, что вы ищете, это referer. При работе вашего before_filter вы можете переопределить Devise after_sign_up_path_for:

def after_sign_up_path_for(user)
  request.referer
end

ИЗМЕНИТЬ

Так как request.referer как-то не работает, я думаю, вы можете пойти с решением на основе сеанса:

def auth_user
  session[:before_sign_up_path] = request.fullpath
  redirect_to new_user_registration_url unless user_signed_in?
end

def after_sign_up_path_for(user)
  session[:before_sign_up_path]
end

Ответ 2

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

Создайте класс, который расширяет Devise::FailureApp

class RedirectToSignUp < Devise::FailureApp
  def redirect_url
     new_user_registration_url
  end

  def respond
    if http_auth?
      http_auth
    else
      redirect_to new_user_registration_url
    end
  end
end

Добавьте это в свой devise инициализатор config/initializers/devise.rb

config.warden do |manager|
  manager.failure_app = RedirectToSignUp
end

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

Ответ 3

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

Перемещение по исходному коду Devise (this и this) я предполагаю, что вы можете расширить Devise::RegistrationsController, а затем переопределить метод after_sign_up_path_for как stored_location_for(:user) || root_path.

Ответ 4

способ, которым я хотел бы настроить свою область пользователей с помощью devise:

  # config/routes.rb
  devise_for :users, :controllers => {
    registrations: 'users/registrations',
    sessions: "users/sessions",
    passwords: 'users/passwords',
    confirmations: 'users/confirmations'
  }

  authenticate :provider do
    namespace :providers do
      ....
    end
  end

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

#app/controllers/user_controller.rb
class UserController < ApplicationController
  before_filter :authenticate_user!
  layout 'users/default'
  before_filter :check_user_active

  private
  def check_user_active
    unless current_user.active
      flash[:notice]= t(:user_not_active)
      sign_out current_user
      redirect_to new_user_session_path
    end
  end
end

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

#app/controllers/users/users_controller.rb
class Users::UsersController < UserController
  ...
end

Я надеюсь, что это поможет.

Ответ 5

Это очень просто

Пользователь store_location_for метод

Как

before_filter :auth_user

def auth_user
  unless user_signed_in?
    store_location_for(:user, request.fullpath)
    redirect_to new_user_registration_url 
  end
end