仅为生产环境禁用设计注册
Posted
技术标签:
【中文标题】仅为生产环境禁用设计注册【英文标题】:disabling Devise registration for production environment only 【发布时间】:2011-07-19 05:10:44 【问题描述】:我正在推出一个包含一组选定用户的测试版网站。我只想在生产环境中禁用注册,并且只在短时间内禁用(即我不想完全取消我的注册)。我知道我可以简单地隐藏“注册”链接,但我怀疑比我聪明的黑客仍然可以使用 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
它传递为“真”而不是假。有没有办法模拟生产环境?我只是在吐口水。
谢谢!
【问题讨论】:
我刚刚了解到RAILS_ENV
已被弃用,并且最好使用Rails.env
我使用的策略类似于if Rails.env.production?
将一些常量设置为true,然后在测试中,简单地测试常数。
是否可以在测试模式下运行 RSPEC 但让它假装它是生产的?喜欢设置 Rails.env?
您几乎可以在模型中添加 if Rails.env.production? or Rails.env.test?
并以这种方式解决它。
好的。我希望能够在部署之前进行测试......我很新:)
值得注意的是,删除 :registrable 会破坏创建 和 编辑注册的命名路由。这可能超出了预期的效果。
【参考方案1】:
编辑 user
模型并删除 :registerable
,我认为这应该可以满足您的需求。
编辑:
我认为这可行:
if Rails.env.production?
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable
else
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :registerable
end
【讨论】:
这将删除所有环境,对吧?有没有办法在模型级别按环境指定? 不需要这个,但发现我可以在模型中使用“Rails.env”。无价 :) 谢谢。 根据 Chris Nicola 的回答 ***.com/a/8291318/9344,这将禁用编辑注册的功能,这可能超出预期的效果(在我的情况下肯定是这样)。 生产环境下如何禁用/users/sign_in?【参考方案2】:由于其他人遇到了我遇到的问题(请参阅我的 cmets)。这正是我修复它的方法。我使用了墨菲斯劳的想法。但是您还需要确保 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
控制器哈希指定我希望它使用我覆盖的注册控制器。
无论如何,我希望这可以节省一些时间。
【讨论】:
否,因为它继承自Devise:RegistrationsController
,其中包含所有路由处理程序。我所做的就是覆盖创建路由。
接受的答案在生产中对我不起作用-确实如此-谢谢。
还有来自温哥华的你好 ;-) 不要以为我们见过面,但我们有共同的熟人。
非常感谢克里斯! :)
谢谢克里斯·尼古拉!【参考方案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
【讨论】:
这很重要,因为禁用 :registerable 会破坏编辑和创建注册路由。因此,如果您在生产环境中使用已创建的用户进行测试,那么禁用 :registrable 可能会导致一系列问题 没错。实际上,我不得不取消我的注册路线以进行生产。当我重建我的网站的一些核心功能时,我会尝试一下。谢谢! 请务必致电super
,以防这不是生产。以上是关于仅为生产环境禁用设计注册的主要内容,如果未能解决你的问题,请参考以下文章
我应该为生产环境禁用 BroswableAPIRenderer 吗?
在 Spring Boot 应用程序的生产环境中禁用 GraphiQL Playground