action-policy-coder について
Rails アプリケーションで ActionPolicy による認可を実装するコーディングスキルです。ポリシールール、コントローラーチェック、スコープ、キャッシュ、エラーメッセージのローカライズ、テストに加え、GraphQL や ActionCable との連携を扱います。
主な機能
- 01ポリシークラス、ルール、継承
- 02コントローラーでの認可チェック
- 03認可済みリレーションのスコープ
- 04ポリシー結果のキャッシュ
- 05失敗メッセージのローカライズ
- 06RSpec と GraphQL の指針
活用シーン
- 01Rails モデルへの認可ルール追加
- 02ユーザー権限に応じたコレクションの絞り込み
- 03ポリシーとリクエストのスペック作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ majesticlabs-dev/ majestic-marketplace --skill action-policy-coderインストール後、Claude Code で/action-policy-coderを入力して読み込まれたか確認します。
詳細
ActionPolicy Coder
呼び出されたとき
- ポリシークラスを作成し、適切なルールと継承を設定します
- コントローラーで
authorize!とallowed_to?を使用して認可を実装します - フィルタリングされたコレクションに
authorized_scopeを使用してスコープを設定します - パフォーマンスを最適化するためにキャッシュを設定します
- ローカライズされた失敗メッセージのためにI18nを追加します
- ActionPolicy RSpecマッチャーを使用してテストを作成します
- GraphQLおよびActionCableと統合します
インストール
# Gemfile
gem "action_policy"
gem "action_policy-graphql" # For GraphQL integration
# Generate base policy
bin/rails generate action_policy:install
bin/rails generate action_policy:policy Post
ポリシークラス
ApplicationPolicyベース
# app/policies/application_policy.rb
class ApplicationPolicy < ActionPolicy::Base
alias_rule :edit?, :destroy?, to: :update?
pre_check :allow_admins
private
def allow_admins
allow! if user.admin?
end
end
リソースポリシー
# app/policies/post_policy.rb
class PostPolicy < ApplicationPolicy
def index? = true
def show? = true
def update? = owner?
def destroy? = owner? && !record.published?
def publish? = owner? && record.draft?
private
def owner? = user.id == record.user_id
end
コントローラーとの統合
class PostsController < ApplicationController
def show
@post = Post.find(params[:id])
authorize! @post
end
def update
@post = Post.find(params[:id])
authorize! @post
@post.update(post_params) ? redirect_to(@post) : render(:edit)
end
def publish
@post = Post.find(params[:id])
authorize! @post, to: :publish?
@post.publish!
redirect_to @post
end
end
条件付きレンダリング
<% if allowed_to?(:edit?, @post) %>
<%= link_to "Edit", edit_post_path(@post) %>
<% end %>
ポリシースコープ
class PostPolicy < ApplicationPolicy
relation_scope do |relation|
user.admin? ? relation.all : relation.where(user_id: user.id).or(relation.published)
end
relation_scope(:own) { |relation| relation.where(user_id: user.id) }
relation_scope(:drafts) { |relation| relation.where(user_id: user.id, status: :draft) }
end
# Controller usage
@posts = authorized_scope(Post.all)
@drafts = authorized_scope(Post.all, type: :relation, as: :drafts)
キャッシュ
class PostPolicy < ApplicationPolicy
def update?
cache { owner_or_collaborator? } # Cache expensive checks
end
end
# config/initializers/action_policy.rb
ActionPolicy.configure do |config|
config.cache_store = Rails.cache
end
I18n失敗メッセージ
# config/locales/action_policy.en.yml
en:
action_policy:
policy:
post_policy:
update?: "You can only edit your own posts"
destroy?: "You cannot delete a published post"
class ApplicationController < ActionController::Base
rescue_from ActionPolicy::Unauthorized do |exception|
flash[:alert] = exception.result.message
redirect_back fallback_location: root_path
end
end
成果物
認可を実装する際は、次を提供します。
- ポリシークラス:ルール、スコープ、キャッシュを含みます
- コントローラーとの統合:authorize! と allowed_to? の使用
- スコープ設定:indexアクションおよびフィルタリングされたコレクション向け
- I18n:ローカライズされたエラーメッセージ
- テスト:RSpecポリシーおよびリクエストスペック
- GraphQL:該当する場合はミューテーションにpreauthorizeを使用
コメント
Markdown 対応