désactiver l’enregistrement de Devise pour l’environnement de production uniquement

Je lance un site bêta avec un groupe sélectionné d’utilisateurs. Je veux désactiver l’enregistrement uniquement dans l’environnement de production, et seulement pour une courte période (c’est-à-dire que je ne veux pas interférer avec mon enregistrement). Je sais que je peux simplement masquer le lien “inscription”, mais je soupçonne que les pirates plus intelligents que moi peuvent toujours utiliser les routes RESTful pour effectuer des inscriptions. Quelle est la meilleure façon de désactiver l’enregistrement afin que mes environnements de test / développement fonctionnent toujours, mais que la production soit affectée? Merci pour tous les conseils.

J’ai essayé de pointer des étendues nommées de telle manière que “sign_up” passe à “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 à une page “pages # registration_disabled” ou quelque chose comme ça. Je voulais juste travailler avec quelque chose.

EDIT: J’ai changé le modèle comme demandé, puis ajouté les éléments suivants à /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 

c’est passer “vrai” plutôt que faux. Est-il possible de simuler l’environnement de production? Je suis juste en train de cracher dessus.

Merci!

Comme les autres ont le problème, je les ai (voir mes commentaires). Voici exactement comment je l’ai réparé. J’ai utilisé l’idée de murphyslaw. Mais vous devez également vous assurer que le nouveau contrôleur utilise votre nouveau contrôleur pour le routage d’enregistrement ou qu’il ne fera pas beaucoup pour vous.

Voici mon contrôleur prioritaire:

 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 quiconque trébuche sur la page d'inscription pour savoir pourquoi il ne fonctionne pas.

Voici ce qui est dans mes 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'inscriptions surchargé.

En tout cas, j'espère que cela fera gagner du temps à quelqu'un.

Modifiez le modèle d’ user et supprimez :registerable , je pense que cela devrait vous donner ce que vous voulez.

Modifier:

Je pense que cela fonctionnerait:

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

Seulement supprimer :registerable ne résoudra pas le problème. Si vous avez des itinéraires à votre avis, vous obtiendrez une erreur:

undefined local variable or method 'edit_user_registration_path'

Prend soin de ça.

Vous pouvez remplacer le Devise :: RegistrationsController et l’action de création pour redirect vers la page souhaitée. Le contrôleur devrait probablement ressembler à ceci:

 class User::RegistrationsController < Devise::RegistrationsController def create redirect_to your_page_path if Rails.env.production? end end