web-dev-qa-db-ja.com

実稼働環境のDevise登録のみを無効にする

特定のユーザーグループでベータ版サイトを立ち上げています。本番環境でのみ登録を無効にし、短期間のみ無効にします(つまり、登録をすべて無効にしません)。 「サインアップ」リンクを単純に隠すことができることは知っていますが、ハッカーはまだ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

falseではなく「true」として渡されます。実稼働環境をモックアップする方法はありますか?私はこれを吐き出しているだけです。

ありがとう!

69
panzhuli

他の人が私が抱えている問題を抱えているので(コメントを参照)。修正方法は次のとおりです。私はマーフィースローのアイデアを使用しました。ただし、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

コントローラーハッシュは、オーバーライドされた登録コントローラーを使用することを指定します。

とにかく、誰かが時間を節約することを願っています。

88
Chris Nicola

userモデルを編集して:registerableを削除すると、あなたが望むものが得られると思います。

編集:

私はこれがうまくいくと思う:

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

:registerableのみを削除しても問題は解決しません。ビューにいくつかのルートがある場合、エラーが発生します。

undefined local variable or method 'edit_user_registration_path'

これに注意してください。

11
Mindbreaker

devise :: RegistrationsControllerとcreateアクションをオーバーライドして、目的のページにリダイレクトできます。コントローラーはおそらく次のようになります。

class User::RegistrationsController < Devise::RegistrationsController

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

end
6
murphyslaw