Ruby on Rails開発のインターン (Day 24)

こんにちは、皆さん!

今日はいろんな方法試してマップ上にマーカーを追加してみようと思う。いいの見つけれてやることリストの次のものに移れるといいな。
一方で自分のウェブサイトも作っているのでそちらも早くやりたいな。だから、仕事を早く終わらせようというモチベーションにもなっている(笑)。


  • トピック:
  1. punditジェムのインストール
  2. punditの機能を使う


  • 疑問:


  • 問題:
  1. GeocoderがAPIキーの問題があるのでデータベースにデータを追加できない


  • 学習した内容:
  1. punditジェムを使って見やすいコードのままユーザーのアクセス制限を行うことができる


  • 今後やってみたいこと:
  1. 自分のアプリでpunditジェムを使ってみる


  • リソース:
  1. GitHub - varvet/pundit: Minimal authorization through OO design and pure Ruby classes


punditジェムのインストール

punditはすごくよく形成されたジェムであり、それを使って、編集ボタンが見えるかどうかなどのユーザーのアクセス制限を行うことができる。

punditを使うには、まず、下記のようにジェムをGemfileに入れる。

gem "pundit"

続いて、いつも通りのbundle install
そしたら、app/controllers/application_controller.rbに行き、下記のを入れる。

  include Pundit
  protect_from_forgery with: :exception

次に、ターミナルで下記のコマンドを実行する。

rails g pundit:install

これでいくつかの設定をセットアップしてくれるし、app/policiesも作成してくれる。

これで、基本的なセットアップは完了。

punditの機能を使う

では、実際にpunditの機能を使っていこう!!
例えば、Postというモデルがあったとしよう。これをPostを作ったユーザーのみがアクセスできるようにしたいとする。app/models/post.rbの中に下記のような1行が入っていることでしょう。(ユーザーがたくさんのPostを作るため)

belongs_to :user

なので、Postオブジェクトから@post.userのようにそれを作ったユーザーにアクセスすることができるでしょう。

ここで、一つapp/policies/post_policy.rbというファイルを作り、下記のようなコードを入れる。

class PostPolicy < ApplicationPolicy

  def initialize(user, post)
    @user = user
    @post = post
  end

  def edit?
    return true if @user = @post.user
  end

  def destroy?
    return true if @user = @post.user
  end

end

つまり、これらの関数は現在ログインしているユーザーがPostを作成したユーザーである場合のみTrueを返してくる。

そしたら、今度はapp/views/posts/show.html.erbに行き、下記のコードを追加する。

<%= link_to "Edit", edit_post_path(@post) if policy(@post).edit? %>
<%= link_to "Delete", destroy_post_path(@post) if policy(@post).destroy? %>

これが何を表すのかというと、先ほど述べたようにログインしているユーザーがPostを作成したユーザーでない限り、この2行の最後の部分はTrueにならない。だからif文もその時にしか成り立たない。なので、ログインしているユーザーがPostを作成したユーザーでない限り、この2つのボタンは表示されないということである。

まだまだpunditでコントローラーのアクセス制限を設定したりでき、より複雑だがきれいなコードを書くことができる。
この投稿でそこまではカバーできないが、Githubから参照してみてください。

まとめ

今日はまず、なぜAPIキーがエラーを返してくるのか他の人たちと議論した。シニアのディベロッパーとマネージャーの2人とも彼らのテストサイトでは普通に問題なく、実行されるそうなので、ますますなぜなのかわからなくなってくる。とりあえず、この件を彼ら2人に預けて僕はもう少しコードを見回してみた。punditジェムについて学べたのはいいことだったと思う。自分のウェブサイトを作っているところだから、このアクセス制限機能をうまくアドミンユーザーのために実行できればすごく良いものが完成する気がする。
明日になってまだAPIキーの問題への解決策が見当たらなければ、彼らのキーを使わせてもらえるように呼び掛けてみようと思う。


ご精読ありがとうございました。では、また次回まで✌



Day 25はこちら↓↓
programming-shop.hatenablog.com


Day 23はこちら↓↓
programming-shop.hatenablog.com