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


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

Я пробовал указывать именованные области таким образом, что" 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.РБ

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 68

4 ответа:

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

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

вот что в моем routes.rb

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

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

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

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

Edit:

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

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

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

undefined local variable or method 'edit_user_registration_path'

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

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

class User::RegistrationsController < Devise::RegistrationsController

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

end