69 votes

désactivation de l'enregistrement de Devise pour l'environnement de production uniquement

Je lance un site bêta avec un groupe d'utilisateurs sélectionnés. Je veux désactiver l'inscription dans l'environnement de production uniquement, et seulement pour une courte période (c'est-à-dire que je ne veux pas supprimer complètement l'inscription). Je sais que je peux simplement masquer le lien "s'inscrire", mais je soupçonne que des pirates plus malins que moi peuvent toujours utiliser les routes RESTful pour effectuer les inscriptions. Quel est le meilleur moyen de désactiver l'enregistrement afin que mes environnements de test/développement fonctionnent toujours, mais que la production soit affectée ? Merci pour tout conseil.

J'ai essayé de faire pointer les scopes nommés de manière à ce que "sign_up" aille vers "sign_in", mais cela n'a pas fonctionné. Voici ce que j'ai essayé :

devise_scope :user do
    get "users/sign_in", :to => "devise/sessions#new", :as => :sign_in
    get "users/sign_up", :to => "devise/sessions#new", :as => :sign_up
end

Idéalement, nous enverrions l'utilisateur vers une page "pages#registration_disabled" ou quelque chose comme ça. Je voulais juste obtenir quelque chose de fonctionnel avec lequel je puisse jouer.

EDIT : J'ai modifié le modèle comme demandé, puis ajouté ce qui suit à /spec/user_spec.rb

describe "validations" do
    it "should fail registration if in production mode" do
      ENV['RAILS_ENV'] = "production"
      @user = Factory(:user).should_not be_valid
    end
end

il est transmis comme "vrai" plutôt que faux. Existe-t-il un moyen de simuler l'environnement de production ? Je suis juste en train de cracher sur cette question.

Merci !

101voto

Modifier le user et retirer le modèle :registerable je pense que cela devrait vous donner ce que vous voulez.

Edit :

Je pense que ça pourrait marcher :

if Rails.env.production?
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable
else
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :registerable 
end

88voto

Chris Nicola Points 3699

Puisque d'autres ont le même problème que moi (voir mes commentaires). Voici exactement comment je l'ai résolu. J'ai utilisé l'idée de murphyslaw. Mais vous devez aussi vous assurer que devise utilise votre nouveau contrôleur pour le routage de l'enregistrement, sinon il ne fera pas grand chose pour vous.

Voici mon contournement du contrôleur :

class RegistrationsController < Devise::RegistrationsController
  def new
    flash[:info] = 'Registrations are not open yet, but please check back soon'
    redirect_to root_path
  end

  def create
    flash[:info] = 'Registrations are not open yet, but please check back soon'
    redirect_to root_path
  end
end

J'ai ajouté des messages flash pour informer toute personne qui tombe par hasard sur la page d'enregistrement des raisons pour lesquelles elle ne fonctionne pas.

Voici ce qu'il y a dans mon routes.rb

  if Rails.env.production?
    devise_for :users, :controllers => { :registrations => "registrations" } 
  else
    devise_for :users
  end

Le hash des contrôleurs spécifie que je veux qu'il utilise mon contrôleur d'enregistrement surchargé.

Enfin, j'espère que ça fera gagner du temps à quelqu'un.

11voto

Mindbreaker Points 625

Retirez seulement :registerable ne résoudra pas le problème. Si vous avez des routes dans votre vue, vous obtiendrez une erreur :

undefined local variable or method 'edit_user_registration_path'

Occupe-toi de ça.

6voto

murphyslaw Points 431

Vous pouvez remplacer le Devise::RegistrationsController et l'action create pour rediriger vers la page de votre choix. Le contrôleur devrait probablement ressembler à quelque chose comme ceci :

class User::RegistrationsController < Devise::RegistrationsController

  def create
    redirect_to your_page_path if Rails.env.production?
  end

end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X