Ruby on Rails開発のインターン (Day 24)
こんにちは、皆さん!
今日はいろんな方法試してマップ上にマーカーを追加してみようと思う。いいの見つけれてやることリストの次のものに移れるといいな。
一方で自分のウェブサイトも作っているのでそちらも早くやりたいな。だから、仕事を早く終わらせようというモチベーションにもなっている(笑)。
- トピック:
- 疑問:
- 問題:
- GeocoderがAPIキーの問題があるのでデータベースにデータを追加できない
- 学習した内容:
- punditジェムを使って見やすいコードのままユーザーのアクセス制限を行うことができる
- 今後やってみたいこと:
- 自分のアプリでpunditジェムを使ってみる
- リソース:
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の機能を使う
例えば、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キーの問題への解決策が見当たらなければ、彼らのキーを使わせてもらえるように呼び掛けてみようと思う。
ご精読ありがとうございました。では、また次回まで✌