【rails】自身の記事だけ編集できるようにする

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

自身の記事かどうかで表示を分岐する

前回:アプリのフォームから記事の作成・編集・更新・削除をできるようにして、記事情報をユーザーと紐づけた

今回は、自身の投稿記事にのみ「編集」「削除」のボタンを表示させる


exists?(id: @◯◯.id)

app/views/articles/show.html.hamlに条件を追加する

- if user_signed_in? && current_user.articles.exists?(id: @article.id)
  • user_signed_in?
    signed_inしているuserに表示する
  • &&
    かつ
  • current_user.articles.exists?(id: @article.id)
    current_userの持っているarticlesに、id:が @article.idと同じ記事がありますか?exists?

合っているけど、パッと見たときにコードの意図が分かりにくい・・・


has_written?(◯◯)

app/models/user.rbにメソッドを追加する

  def has_written?(article)
    articles.exists?(id: article.id)
  end

has_written?(article)

→ (引数:article)を書きましたか?(writtenはwriteの過去形)

↑やっていることは先程と同じ


app/views/articles/show.html.hamlを書き換える

- if user_signed_in? && current_user.has_written?(@article)

exists?と書くより、has_written?と書くほうが、やりたいことが分かりやすい


  • 複雑なコードは書かない
  • できるだけ簡単に、シンプルに、誰が見ても分かりやすいように書くこと
  • 複雑な条件分岐はmodelでメソッドを定義しておく

ユーザー名を表示する

ユーザー名を設定する

登録しているメールアドレスを分割し、「@」より前の部分をユーザー名にする

  def display_name
    self.email.split('@').first
  end
  1. self.email
    自身のメールアドレスが取得できる
  2. split('@')
    取得したメールアドレスを「@」の位置で分割する
    例)sample1234@gmail.com→「sample1234」「gmail.com」
  3. first(もしくは [0])
    配列の最初(インデックス番号0)の値「sample1234」を取得する
  4. display_name
    「sample1234」がユーザー名となる

これで、登録されているメールアドレスをもとにユーザー名が設定できる


viewに表示させる

記事一覧ページ、記事詳細ページにメソッドを追加する

app/views/articles/show.html.haml_article.html.hamlに書き換える

%p= @article.user.display_name

_article.html.hamlを編集すると、index.html.hamlに反映する

#DAY21