まずKuroko2とは??やKuroko2の素晴らしさには過去書いた下記の記事を見てもらえると 🙏 hatappi.hateblo.jp
Kuroko2に関しては画面上からScriptを定義したり定期実行をしてその実行ログなどが見られる
ただ権限管理のような機能は現状ない。第三者のアクセスに関してはIP制限なりBasic認証で防げば良いと思う
ただ小さなチームで運用していく中ではScriptを追加したり更新したりはしては困るけど実行結果や内容の確認などで閲覧だけ許したい時があるのかなと思います。 僕はありました
なので作りました 👍
使い方に関してはgem内の README.md に記載されていて
generatorでmigrationファイルを作成して後はKuroko2の設定ファイルにextensionとして今回のgemのconcernを追加するだけで使用できます
Kuroko2には自作したConcernを追加できる
Kuroko2では設定ファイル(config/kuroko2.yml)に下記のようにKuroko2内で使用したいConcernを追加することが出来る
default: &default extentions: controller: - '::Kuroko2ReadOnly::RequestHandler'
仕組みとしてはKuroko2のengine.rbで設定ファイルされたものがincludeされている
今回のgemもこちらの機能を使用している
追加したConcern
今回は下記のようなConcernを追加しました
中身はシンプルでReadOnlyの時はGETリクエスト以外はExceptionを出すだけです
require 'active_support' module Kuroko2ReadOnly module RequestHandler extend ::ActiveSupport::Concern included do before_action :get_request_only end private def get_request_only if current_user && current_user.read_only? raise ::Kuroko2ReadOnly::AccessDenied unless request.get? end end end end
おまけ
今回はConcernだけでなく自分以外のユーザーのReadOnlyにするかどうかを設定する画面をMountableEngineで追加しました
viewを作る際にスタイルなどを1からあてるのは骨がおれるのでKuroko2に依存するgemでもあるのでlayoutもKuroko2のものを使用しました
使用自体は下記のように指定するだけでKuroko2ReadOnlyのMountableEngine内のViewでもKuroko2のlayoutが使用できます
class Kuroko2ReadOnly::ApplicationController < ActionController::Base layout 'layouts/kuroko2/application' ~~~ end
ただこれだけではうまくいかない!!
Kuroko2内のlayoutで定義されている osd_path
のようなKuroko2内のroutesで定義されている
もしKuroko2ReadOnlyから使用するのであれば kuroko2.omd_path
のように指定しなければならない
ただ今回はKuroko2のgemのlayoutを使用しているので、指定ができない
なので…
module Kuroko2ReadOnly module ApplicationHelper def method_missing(method, *args, &block) if (method.to_s.end_with?('_path') || method.to_s.end_with?('_url')) && kuroko2.respond_to?(method) kuroko2.send(method, *args) else super end end end end
このようなものを追加しました
これは定義されていないメソッドなどが呼ばれた時にcallされる method_missing
をoverrideしているもので、仮に omd_path
のようなpathがわたってきてKuroko2ReadOnlyないでは定義されてないがKuroko2側にあるpathの場合はKuroko2でsendして呼び出しそのパス情報を返すようにします
これにより何とか今回使用するGemからKuroko2のlayoutを使用できるようになりました
最後に
使ってなにか不便があればISSUEやTwitterなどでメンションください 🙏