Deaktivieren der Geräteregistrierung nur für die Produktionsumgebung

69

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!

Panzhuli
quelle
Ich habe gerade erfahren, dass dies RAILS_ENVveraltet 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.
Fareesh Vijayarangam
Ist es möglich, RSPEC im Testmodus auszuführen, aber so zu tun, als wäre es Produktion? wie set Rails.env?
Panzhuli
Sie können if Rails.env.production? or Rails.env.test?das Modell so ziemlich einfach hinzufügen und auf diese Weise lösen.
Fareesh Vijayarangam
in Ordnung. Ich hatte gehofft, vor dem Einsatz testen zu können ... ich bin ziemlich neu :)
Panzhuli
1
Es ist erwähnenswert, dass das Entfernen von: registrable die genannten Routen zum Erstellen und Bearbeiten von Registrierungen unterbricht. Dies ist wahrscheinlich mehr als der gewünschte Effekt.
Chris Nicola

Antworten:

88

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.

Chris Nicola
quelle
3
Nein, weil es erbt, von Devise:RegistrationsControllerdem alle Routenhandler enthalten sind. Ich habe lediglich die Erstellungsroute überschrieben.
Chris Nicola
Die akzeptierte Antwort hat bei mir in der Produktion nicht funktioniert - das tut es - danke.
Richard Hollis
Und hallo auch aus Vancouver ;-) Ich glaube nicht, dass wir uns getroffen haben, aber wir haben gegenseitige Bekannte.
Ted
Vielen Dank Chris! :)
Katie H
1
Vielen Dank, Chris Nicola!
2.
102

Bearbeiten Sie das userModell 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
Fareesh Vijayarangam
quelle
Das würde sich für alle Umgebungen entfernen, oder? Gibt es eine Möglichkeit, auf Modellebene nach Umgebung zu spezifizieren?
Panzhuli
7
Ich brauchte das nicht, entdeckte aber, dass ich "Rails.env" in Modellen verwenden konnte. Unbezahlbar :) Danke.
Vvohra87
8
Gemäß der Antwort von Chris Nicola stackoverflow.com/a/8291318/9344 wird dadurch die Möglichkeit zum Bearbeiten von Registrierungen deaktiviert, was wahrscheinlich mehr als der gewünschte Effekt ist (war definitiv in meinem Fall).
Ted
Wie deaktiviere ich / users / sign_in in der Produktion?
WM
11

Nur entfernen :registerablewird 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.

Mindbreaker
quelle
ein Neustart der App auch erforderlich sein kann
Will
6

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
Murphys Gesetz
quelle
1
Dies ist wichtig, da durch Deaktivieren: registrierbar die Registrierungsrouten sowohl bearbeitet als auch erstellt werden. Wenn Sie also in der Produktion mit Benutzern testen, die Sie bereits deaktiviert haben: Registrierbar kann eine Reihe von Problemen verursachen
Chris Nicola
Genau. Ich musste tatsächlich meine Registerroute für die Produktion töten. Ich werde es versuchen, während ich einige der Kernfunktionen meiner Website neu erstelle. Vielen Dank!
Panzhuli