Ich starte eine Beta-Site mit einer ausgewählten Gruppe von Benutzern. Ich möchte die Registrierung nur in der Produktionsumgebung und nur für kurze Zeit deaktivieren (dh ich möchte meine Registrierung nicht vollständig stören). Ich weiß, dass ich den Link "Anmelden" einfach ausblenden kann, aber ich vermute, dass Hacker klüger sind, als ich die RESTful-Routen weiterhin verwenden kann, um Registrierungen durchzuführen. Was ist der beste Weg, um die Registrierung zu deaktivieren, damit meine Test- / Entwicklungsumgebungen weiterhin funktionieren, die Produktion jedoch betroffen ist? Vielen Dank für Hinweise.
Ich habe versucht, benannte Bereiche so zu kennzeichnen, dass "sign_up" zu "sign_in" wechselt, aber es hat nicht funktioniert. Folgendes habe ich versucht:
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
Im Idealfall senden wir den Benutzer auf eine Seite "pages # registration_disabled" oder ähnliches. Ich wollte nur etwas zum Laufen bringen, mit dem ich herumspielen kann.
BEARBEITEN: Ich habe das Modell wie gewünscht geändert und dann Folgendes zu /spec/user_spec.rb hinzugefügt
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
es geht eher als "wahr" als als falsch über. Gibt es eine Möglichkeit, die Produktionsumgebung zu verspotten? Ich spucke nur diesen einen aus.
Vielen Dank!
RAILS_ENV
veraltet ist und bevorzugt wird.Rails.env
Die Strategie, die ich verwenden würde, besteht darin,if Rails.env.production?
eine Konstante auf true zu setzen. Testen Sie dann im Test einfach die Konstante.if Rails.env.production? or Rails.env.test?
das Modell so ziemlich einfach hinzufügen und auf diese Weise lösen.Antworten:
Da andere das Problem haben, habe ich (siehe meine Kommentare). Hier ist genau, wie ich es behoben habe. Ich habe Murphyslaws Idee benutzt. Sie müssen aber auch sicherstellen, dass devise Ihren neuen Controller für das Registrierungsrouting verwendet, da dies sonst nicht viel für Sie bedeutet.
Hier ist meine Controller-Überschreibung:
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
Ich habe Flash-Nachrichten hinzugefügt, um jeden zu informieren, der irgendwie auf die Registrierungsseite stößt, warum es nicht funktioniert.
Hier ist was in meinem ist
routes.rb
if Rails.env.production? devise_for :users, :controllers => { :registrations => "registrations" } else devise_for :users end
Der Controller-Hash gibt an, dass mein überschriebener Registrierungs-Controller verwendet werden soll.
Wie auch immer, ich hoffe das spart jemandem etwas Zeit.
quelle
Devise:RegistrationsController
dem alle Routenhandler enthalten sind. Ich habe lediglich die Erstellungsroute überschrieben.Bearbeiten Sie das
user
Modell und entfernen Sie:registerable
, ich denke, das sollte Ihnen geben, was Sie wollen.Bearbeiten:
Ich denke das würde funktionieren:
if Rails.env.production? devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable else devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :registerable end
quelle
Nur entfernen
:registerable
wird das Problem nicht lösen. Wenn Sie einige Routen in Ihrer Ansicht haben, wird eine Fehlermeldung angezeigt:undefined local variable or method 'edit_user_registration_path'
Pass darauf auf.
quelle
Sie können den Devise :: RegistrationsController und die Erstellungsaktion überschreiben, um zur gewünschten Seite umzuleiten. Der Controller sollte wahrscheinlich ungefähr so aussehen:
class User::RegistrationsController < Devise::RegistrationsController def create redirect_to your_page_path if Rails.env.production? end end
quelle