私のアプリケーションにはいくつかの異なるユーザータイプがあります。私はコントローラにアクセスするときにこのようなことをしようとしていました。"or"ステートメントを使用したbefore_action
class Admins::ProgrammesController < ApplicationController
# only allow entry if the user is one of these types.
before_action :authenticate_admin! || :authenticate_super_admin! || :authenticate_programme_leader! || :authenticate_caseworker!
def index
end
ユーザーの種類を確認するには、このコントローラにアクセスできます。
ああ、それは正しいとは思われません。 Railsは最初のbefore_action
引数に注意を払うだけです - ユーザがadminかどうかを確認してください。したがって、ユーザーがケースワーカーである場合、私の仕様は合格しません。
これをどのようにして同様の方法で達成できますか?要求され、より多くのコードとして
UPDATE
..
これは私の失敗の仕様です。
RSpec.describe Admins::ProgrammesController, :type => :controller do
context 'authenticated user' do
before :each do
@user = FactoryGirl.create :caseworker
sign_in @user
end
describe 'GET index' do
it 'responds with a 200 OK status code' do
get :index
expect(response).to have_http_status(:success)
end
end
end
end
私は、Caseworkタイプのユーザーが作成されていることを100%確信しています。ここに工場があります。
FactoryGirl.define do
factory :caseworker, class: 'Users::Caseworker' do
email { "[email protected]" }
password { "password" }
end
end
ここにルートファイルの関連する行があります。
Rails.application.routes.draw do
devise_for :users, controllers: {sessions: 'users/sessions'}, skip: :registrations
devise_for :admins, class_name: 'Users::Admin'
devise_for :caseworker, class_name: 'Users::Caseworker'
devise_for :cardholder, class_name: 'Users::Cardholder'
devise_for :programme_leader, class_name: 'Users::ProgrammeLeader'
devise_for :super_admin, class_name: 'Users::SuperAdmin'
scope module: 'admins' do
# this is the route in question...
resources :programmes, only: [:index, :show, :new]
admin、super_adminなどの別々のスコープがありますか(つまり、authenticate_admin!メソッドdeviseはあなたに無料で与えるか、自分で書いたものですか?後者の場合、それは何ですか?) –
それは、私は自分自身を書いた。基本的にSTIです。作成できるユーザーにはいくつかの種類があります。ユーザーはそれぞれの親クラスです。今は何も特別なことをしていない、彼らはちょうど異なるタイプのユーザーです。 – mikelovelyuk
認証方法を表示できますか? –