routes.rbでDeviseの承認をやっていく。

いまDiscourse読んでるので思いついたやつを思いついたままメモってます。

constraintsを使います

UserというDevise用のモデルがあるとして、いわゆるcurrent_userの取得成功を以て承認とします。

class Constraint::Config
  def matches?(request)
    !!warden(request).authenticate(scope: :user)
  end

  def warden(request)
    request.env['warden']
  end
end
  scope :configs, module: :users, constraints: Constraint::Config.new do
    get 'index', to: 'configs#index'
    get 'password', to: 'passwords#edit'
    put 'password', to: 'passwords#update'
  end

  get 'configs/*path', to: ->(env) { [403, {'Content-Type' => 'text/plain'}, ['forbidden']] }

DiscourseのadminルートではActionController::RoutingErrorで投げっぱなしでしたが、ユーザーページであることを考慮して403とか何か出すみたいな感じで。

ところでrequest_specでDeviseアカウントにサインインするには

request_specファイル内で

include Warden::Test::Helpers

しといて

login_as @user, scope: :user, :run_callbacks => false

参考 RequestSpecでDeviseを使ったユーザーでログインさせる