仅针对生产环境禁用Devise注册


69

我正在与一组特定的用户一起启动Beta版网站。我只想在生产环境中禁用注册,并且只能禁用一小段时间(即,我不想完全取消注册)。我知道我可以简单地隐藏“注册”链接,但是我怀疑黑客比我仍然可以使用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

它传递的是“ true”而不是false。有没有办法模拟生产环境?我只是在吐口水。

谢谢!


我刚刚了解到它RAILS_ENV已被弃用,因此首选使用Rails.env 该策略。我将使用的策略类似于if Rails.env.production?将一些常量设置为true,然后在测试中仅测试该常量。
Fareesh Vijayarangam 2011年

是否可以在测试模式下运行RSPEC,但是否假装它是生产环境?喜欢设置Rails.env?
panzhuli 2011年

您几乎可以只添加if Rails.env.production? or Rails.env.test?模型并以这种方式解决它。
Fareesh Vijayarangam 2011年

好。我希望能够在部署之前进行测试……我
还很

1
值得注意的是,删除:registrable会中断创建编辑注册的命名路由。这可能超出预期的效果。
克里斯·尼古拉

Answers:


88

由于其他人遇到了我遇到的问题(请参阅我的评论)。这就是我固定的方式。我用了墨菲斯劳的想法。但是,您还需要确保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

我添加了Flash消息,通知那些偶然发现注册页面为何不起作用的人。

这是我的内心 routes.rb

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

控制器哈希指定我希望它使用我的覆盖的注册控制器。

无论如何,我希望可以节省一些时间。


3
否,因为它继承了Devise:RegistrationsController其中包含的所有路由处理程序。我所做的就是覆盖创建路径。
克里斯·尼古拉

接受的答案在生产中对我不起作用-可以-谢谢。
理查德·霍利斯

温哥华也打招呼;-)不要以为我们见过面,但是我们彼此相识。
Ted

克里斯,谢谢你!:)
凯蒂·H

1
谢谢克里斯·尼古拉!
rld

102

编辑user模型并删除:registerable,我认为这应该给您您想要的。

编辑:

我认为这会起作用:

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

那将消除所有环境,对吧?有没有一种方法可以在模型级别按环境指定?
panzhuli 2011年

7
不需要这个,但是发现我可以在模型中使用“ Rails.env”。无价:)谢谢。
vvohra87

8
根据克里斯·尼古拉(Chris Nicola)的答案stackoverflow.com/a/8291318/9344,这将禁用编辑注册的功能,这可能超出预期的效果(在我的情况下肯定是这样)。
Ted

如何在生产环境中禁用/ users / sign_in?
WM

11

仅删除:registerable不会解决问题。如果您的视图中有一些路线,则会出现错误:

undefined local variable or method 'edit_user_registration_path'

照顾这个


可能还需要重新启动应用程序
2013年

6

您可以覆盖Devise :: RegistrationsController和create动作以重定向到所需的页面。控制器可能看起来像这样:

class User::RegistrationsController < Devise::RegistrationsController

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

end

1
这很重要,因为禁用:registerable会同时破坏编辑和创建注册路径。因此,如果您正在与用户一起进行生产测试,那么您已经创建了disable:registrable可能会导致很多问题
Chris Nicola

究竟。实际上,我不得不取消我的注册路线以进行生产。在重新构建网站的某些核心功能时,我将尝试一下。谢谢!
panzhuli
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.