отключение регистрации Devise только для производственной среды - PullRequest
69 голосов
/ 20 марта 2011

Я запускаю бета-сайт с избранной группой пользователей.Я хочу отключить регистрацию только в производственной среде и только на короткий промежуток времени (то есть я не хочу обнулять свою регистрацию вообще).Я знаю, что могу просто скрыть ссылку «зарегистрироваться», но подозреваю, что хакеры умнее, чем я, все же могут использовать маршруты RESTful для выполнения регистрации.Какой лучший способ отключить регистрацию, чтобы мои среды тестирования / разработки все еще работали, но это влияло на производительность?Спасибо за любые указатели.

Я пытался указывать именованные области таким образом, чтобы «sign_up» переходил к «sign_in», но это не сработало.Вот что я попробовал:

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

В идеале, мы бы отправили пользователя на страницу "pages # registration_disabled" или что-то в этом роде.Я просто хотел, чтобы что-то работало, с чем я могу поиграть.

РЕДАКТИРОВАТЬ: я изменил модель в соответствии с запросом, затем добавил следующее в /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

это звучит как «правда», а не как ложь.Есть ли способ смоделировать производственную среду?Я просто плевался этим.

Спасибо!

Ответы [ 4 ]

101 голосов
/ 20 марта 2011

Отредактируйте модель user и удалите :registerable, я думаю, это должно дать вам то, что вы хотите.

Редактировать:

Я думаю, это будет работать:

if Rails.env.production?
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable
else
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :registerable 
end
88 голосов
/ 28 ноября 2011

Так как у других есть проблема, которую я имею (см. Мои комментарии).Вот именно как я это исправил.Я использовал идею Murphyslaw.Но вам также нужно убедиться, что devise использует ваш новый контроллер для маршрутизации регистрации, иначе он не будет вам полезен.

Вот переопределение моего контроллера:

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

I 'Мы добавили флеш-сообщения, чтобы проинформировать любого, кто каким-то образом наткнулся на страницу регистрации, почему она не работает.

Вот что есть в моем routes.rb

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

Хэш контроллеров указываетЯ хочу, чтобы он использовал мой переопределенный контроллер регистрации.

В любом случае, я надеюсь, что это сэкономит кому-то время.

11 голосов
/ 03 января 2013

Только удалить :registerable не решит проблему.Если у вас есть несколько маршрутов на ваш взгляд, вы получите ошибку:

undefined local variable or method 'edit_user_registration_path'

Позаботьтесь об этом.

6 голосов
/ 17 июля 2011

вы можете переопределить Devise :: RegistrationsController и действие create для перенаправления на нужную страницу.Контроллер, вероятно, должен выглядеть примерно так:

class User::RegistrationsController < Devise::RegistrationsController

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

end
...