ユーザーがログインした後(DeviseとOmniAuthを使用)、いくつかの基準に基づいてユーザーを別のページにリダイレクトする必要があるRailsアプリがあります。このロジックは、次のように疑似コーディングできます。
if the user is an admin
if no url was specified before login (original_uri)
- redirect to admin panel
else
- redirect to original_uri
else
if the user filled up his profile data
if no url was specified before login
- redirect to user's home page
else
if original_uri is allowed (not restricted to that user)
- redirect to original_uri
else
- redirect to user's home page
else
- redirect to profile page
またはrspec統合の例として:
describe "complex routing" do
context "user is an admin" do
let(:user) { create(:admin) }
context "an original URL was specified before login" do
it "redirects to the original URL"
end
context "no original URL was specified" do
it "redirects to the admin panel"
end
end
context "user is not an admin" do
let(:user) { create(:user, :completed_profile => false) }
context "with complete profile info" do
before(:each) { user.completed_profile = true }
context "an original URL was specified before login" do
it "redirects to original URL if not restricted"
it "redirects to home page if URL is restricted"
end
context "no original URL was specified" do
it "redirects to home page"
end
end
context "with incomplete profile" do
it "redirects to profile page"
end
end
end
ご覧のとおり、これは非常に複雑になり、あまり明白ではありません(またはテストが簡単ではありません)。さらに、これをbefore_filter :decide_routing
メソッド呼び出しとして座っていると考えると、私はうんざりします。
これを抽象化し、将来的に(より多くのロジックを追加または変更する必要がある場合に備えて)これをよりクリーンでテスト可能で管理しやすくするための良い方法は何でしょうか?
どんな考えも素晴らしいでしょう-ありがとう。