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