駆け出しエンジニアさん向けの情報を発信していきます。itLinkedInPocketCopyにゅ~ぶるこんにちは、にゅ〜ぶるです。こんにちは〜、ぶるこだよ〜💕ぶるこにゅ~ぶるさて、第4回目ですね!前回は、こちら今日は、「Punditで認可の権限管理する」について、進めていきたいと思います!にゅ~ぶるPunditとは、認可の仕組みを提供してくれるライブラリ(Gem)です。https://github.com/varvet/pundit認可、つまり、ユーザが機能を使えるかどうかを判定する処理を行います。にゅ~ぶるでは早速、使ってみましょう。Gemfileに以下を追加します。install」ですね。installにゅ~ぶるこれでPunditが使えるようになりました。次は、設定ファイルを作っていきます。generatorが用意されているので、それを使います。pundit:installにゅ~ぶるそうすると、app/policies/配下にapplication_policy.rbというファイルが作成されます。endendにゅ~ぶるinitializerで定義されるuserはデフォルトでcurrent_userが引数に割り当てられるようになっているので、deviseを使ってログイン機能を作った際はそのまま利用できます。recordの方には対応するモデルを割り当てていきます。※後述にゅ~ぶるでは、この設定を有効にするために、有効にしたいControllerに次の1行を追加してください。各Controllerに追加しても良いですが、ApplicationControllerに追加する事で、継承されている全てのControllerで有効にする事ができますので、こちらを使いましょう。Punditendにゅ~ぶる次に、このファイルを継承して、各Controllerごとにファイルを作成していくことになります。にゅ~ぶる今回は、app/policies/配下にtask_policy.rbというファイルが作成しましょう。アクション名?で認可ルールを作成と言う感じです。AppicationPolicyを継承しているため、独自にしたいアクション名のメソッドのみ作成すれば良いですが、AppicationPolicyのアクションに対応したメソッドを見て貰うと分かる通り、全てがfalseになっているため、全てが使えない状態になりますので、追加していきましょう。※後からでも良いです。にゅ~ぶるそして次は、各ControllerのアクションでPunditを使うように設定していきます。各アクションに以下の1行を追加してください。モデルのインスタンス※このインスタンスがrecordに設定されます。モデルと書き方が少し違います。・・endにゅ~ぶるでは、設定したので、実際にブラウザでアクセスしてみましょう。s」で起動させたのち、「http://localhost:3000/tasks」にアクセスしてみてください。エラーが出るよおおお😭ぶるこにゅ~ぶるそうですね。前述した通り、Deviseなどを使っている場合は、current_userが存在しますが、今回は省略させて貰っているので、作る必要がありますね。endendにゅ~ぶるではもう一度アクセスしてみてください。エラー!!💢ぶるこにゅ~ぶる落ち着いて、ちゃんとみてね笑あ!これが認可されなかったエラーなのか!えへへ💕ぶるこにゅ~ぶるそうなんだ。エラー画面を作る必要があるけど、まずは通常のエラー画面が出ればOKです。にゅ~ぶるでは、各アクションの認可の仕組みを追加してみてください。一覧画面や新規画面については、誰でもOKなので、常にtrueを返すようにしましょう。参照や更新、削除については、そのTaskを作成したユーザが自分の場合のにOK(true)とする必要がありますね。にゅ~ぶる答えは、こんな感じ。endendにゅ~ぶるでも、これだけじゃダメですよ。各アクションのメソッドで、Punditのauthorizeも必要ですね。にゅ~ぶる全てが完了したら、id=1のUserのTaskと、id=2のTaskを作るなどして、処理が正しく動いているか確認してみて下さい。できたぁ💕ぶるこにゅ~ぶるエラー画面については、rescue_fromを使ってごにょごにょしたり、固定のエラーページに飛ばしたり、強制でルートURLに遷移させたり、使い方は色々ありますので、自分にあった方法を見つけてみて下さい。にゅ~ぶる今回はここまでだよ。「Todoサービスを作る!」をテーマにお送りしております。アジェンダは、こちら質問等ありましたら、コメントなりTwitterなりで頂ければ対応させて頂きますので、遠慮なく利用くださいね。コメントをキャンセルメールアドレスが公開されることはありません。*ウェブサイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。最近のコメント表示できるコメントはありません。