Je lance un site bêta avec un groupe restreint d'utilisateurs. Je souhaite désactiver l'enregistrement dans l'environnement de production uniquement, et uniquement pour une courte période (c'est-à-dire que je ne veux pas nuquer complètement mon enregistrement). Je sais que je peux simplement masquer le lien "inscription", mais je soupçonne que les pirates informatiques sont plus intelligents que je peux encore utiliser les routes RESTful pour effectuer les enregistrements. Quelle est la meilleure façon de désactiver l'enregistrement pour que mes environnements de test/développement fonctionnent toujours, mais la production est 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 faire fonctionner quelque chose avec lequel je peux jouer.
EDIT: J'ai changé 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
cela passe comme "vrai" plutôt que faux. Existe-t-il un moyen de simuler l'environnement de production? Je suis juste en train de cracher celui-ci.
Merci!
Puisque d'autres ont le problème que j'ai (voir mes commentaires). Voici exactement comment je l'ai corrigé. J'ai utilisé l'idée de murphyslaw. Mais vous devez également vous assurer que devise utilise votre nouveau contrôleur pour le routage d'enregistrement, sinon il ne fera pas grand-chose pour vous.
Voici ma priorité de 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 d'une manière ou d'une autre sur la page d'inscription pourquoi cela ne fonctionne pas.
Voici ce qui est dans mon routes.rb
if Rails.env.production?
devise_for :users, :controllers => { :registrations => "registrations" }
else
devise_for :users
end
Le hachage des contrôleurs spécifie que je veux qu'il utilise mon contrôleur d'enregistrements substitué.
Quoi qu'il en soit, j'espère que cela fera gagner du temps à quelqu'un.
Modifiez le modèle 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
Supprimer uniquement :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 rediriger 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