Отключить регистрацию регистрации только для производственной среды

Я запускаю бета-сайт с избранной группой пользователей. Я хочу отключить регистрацию только в производственной среде и только на короткий промежуток времени (т.е. Я не хочу полностью блокировать мою регистрацию). Я знаю, что могу просто спрятать ссылку "зарегистрироваться", но я подозреваю, что хакеры умнее, чем я могу использовать маршруты 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

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

EDIT: Я изменил модель по запросу, а затем добавил в /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

он передается как "истинный", а не "ложный". Есть ли способ издеваться над производственной средой? Я просто плюю с этим.

Спасибо!

Ответ 1

Поскольку у других возникает проблема, с которой я сталкиваюсь (см. мои комментарии). Вот как я его исправил. Я использовал идею с мульфильм. Но вы также должны убедиться, что 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

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

Вот что находится в моем routes.rb

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

Контроллер hash указывает, что я хочу, чтобы он использовал мой переопределенный контроллер регистрации.

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

Ответ 2

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

Edit:

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

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

Ответ 3

Удалить только :registerable не решит проблему. Если у вас есть какие-то маршруты в вашем представлении, вы получите сообщение об ошибке:

undefined local variable or method 'edit_user_registration_path'

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

Ответ 4

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

class User::RegistrationsController < Devise::RegistrationsController

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

end