リハビリも兼ねてちょっと欲しかった Gem を作ってみました。
作り始める前に調べていたつもりだったのだけれど モロかぶりしているGem がすでに存在して名前もまったく一緒だったので諦めて simple
みたいな無意味な名前になってしまった。
やりたかったことは Rails のアクションにアノテートしておいて一律でチェック出来るようにするという感じのこと。
class HogeController < ApplicationController include SimpleAnnotation::Annotatable def index end annotates :premium def show # 課金ユーザーだけ見られる何か end end
こういう感じで書いておいてフィルターなどでチェックする想定です。 #annotate
ってメソッド名に出来なかったのは ActiveRecord::QueryMethods#annotate があるから。
class PremiumFilter def self.filter(controller, current_user) action = controller.action_name return unless controller.class.annotated?(action, with: :premium) controller.redirect_to plans_path unless current_user.premium? end end class ApplicationController before_action -> { PremiumFilter.filter(self, current_user) } end
こんなことしなくても実現は出来そう。
まあ、メタプログラミング完全に忘れていていたのでいい復習になりました。