Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 仅为生产环境禁用设备注册_Ruby On Rails_Devise_Registration_Production Environment - Fatal编程技术网

Ruby on rails 仅为生产环境禁用设备注册

Ruby on rails 仅为生产环境禁用设备注册,ruby-on-rails,devise,registration,production-environment,Ruby On Rails,Devise,Registration,Production Environment,我正在推出一个测试版网站,选择了一组用户。我只想在生产环境中禁用注册,并且只在短时间内禁用(即,我不想完全取消注册)。我知道我可以简单地隐藏“注册”链接,但我怀疑比我聪明的黑客仍然可以使用RESTful路由来完成注册。禁用注册以使我的测试/开发环境仍然工作,但生产受到影响的最佳方法是什么?谢谢你的指点 我尝试过以这样一种方式指向命名的作用域,即“注册”变为“登录”,但它不起作用。以下是我尝试过的: devise_scope :user do get "users/sign_in", :t

我正在推出一个测试版网站,选择了一组用户。我只想在生产环境中禁用注册,并且只在短时间内禁用(即,我不想完全取消注册)。我知道我可以简单地隐藏“注册”链接,但我怀疑比我聪明的黑客仍然可以使用RESTful路由来完成注册。禁用注册以使我的测试/开发环境仍然工作,但生产受到影响的最佳方法是什么?谢谢你的指点

我尝试过以这样一种方式指向命名的作用域,即“注册”变为“登录”,但它不起作用。以下是我尝试过的:

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
它是作为“真实”而不是虚假传递的。有没有办法模拟生产环境?我只是把这件事搞砸了


谢谢

编辑
用户
模型并删除
:registerable
,我认为这应该能满足您的需求

编辑:

我认为这是可行的:

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

您可以重写designe::RegistrationController和create操作以重定向到所需的页面。控制器的外观可能如下所示:

class User::RegistrationsController < Devise::RegistrationsController

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

end
class User::RegistrationController
因为其他人也有我的问题(见我的评论)。这正是我修复它的方法。我用了murphyslaw的主意。但是,您还需要确保Deave使用您的新控制器进行注册路由,否则它不会对您有多大帮助

这是我的控制器覆盖:

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
控制器散列指定我希望它使用我的覆盖注册控制器


无论如何,我希望这能节省一些时间。

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

未定义的局部变量或方法“编辑用户注册路径”



注意这一点。

这将在所有环境中删除,对吗?有没有一种方法可以在模型级别按环境指定?不需要,但我发现可以在模型中使用“Rails.env”。无价之宝:)谢谢。根据Chris Nicola的回答,这将禁用编辑注册的功能,这可能超出预期效果(我的情况肯定是这样的)。如何在生产环境下禁用/users/sign_?我刚刚了解到
RAILS\u ENV
已被弃用,而且我更倾向于使用
RAILS.ENV
我使用的策略类似于
if RAILS.ENV.production?
将一些常量设置为true,然后在测试中,简单地测试常量。是否可以在测试模式下运行RSPEC,但让它假装它是生产的?像set Rails.env?您几乎可以添加
if Rails.env.production?或者Rails.env.test?
在模型中,以这种方式进行求解。好的。我希望在部署之前能够进行测试。。。我很新:)值得注意的是删除:registable会破坏创建和编辑注册的命名路由。这可能超出了预期效果。这很重要,因为禁用:registerable会中断编辑和创建注册路由。因此,如果您在生产环境中使用您已经创建的用户进行测试,禁用:registable可能会导致一系列问题。事实上,我不得不取消我的生产注册路线。我将在重建网站的一些核心功能时尝试一下。谢谢如果这不是生产,请确保调用
super
。否,因为它继承自包含所有路由处理程序的
develope:RegistrationController
。我所做的就是覆盖创建路线。接受的答案在生产中对我不起作用-这是-谢谢。温哥华的你好;-)别以为我们见过面,但我们彼此都认识。非常感谢你,克里斯!:)谢谢,我是克里斯·尼古拉!可能还需要重新启动应用程序
  if Rails.env.production?
    devise_for :users, :controllers => { :registrations => "registrations" } 
  else
    devise_for :users
  end