6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2022年5月20日 投稿機能を作成

今回実装した機能

  • 投稿一覧ページにログインユーザーの新規投稿ページへ遷移するボタンを実装 Image from Gyazo

仕様

  • userとpostを紐付ける

  • new Postリンクをクリックすると、投稿フォームが出る

  • 投稿に成功したら、投稿一覧に遷移する

  • 投稿に成功したら、「投稿に成功しました」というフラッシュメッセージを出す

実装を通した気づき

Yano
  • 外部キーの途中追加・・・rails g migration add_user_id_to_posts
    • migrationファイルに追記
class AddUserIdToPosts < ActiveRecord::Migration[6.0]
  def change
    add_reference :posts, :user, foreign_key: true
  end
end
  • ログインしているユーザーの持つpostを新規作成
    • saveに成功した場合はユーザーの投稿一覧ページに遷移させる
    • user_posts_path(current_user)とする。
    • save!とすると投稿に失敗した場合に例外を返す。falseの処理がある場合はsaveを使用する。
  def create
    @post = current_user.posts.build(post_params)
    if @post.save
      redirect_to user_posts_path(current_user)
    else
      render 'new'
    end
  end
Yui
  • current_userは、sorceryのメソッドで現在のユーザーを取得できます。
  • ルーティングの設計方法が完全に理解できていないことに気づきました。
    • 今回投稿はユーザーモデルに紐づくためネストして記述しました。しかし、それだけだと投稿一覧ページに遷移出来ずエラーが発生しました。
    • そこで、ネストしないユーザーに紐づかないルーティングを追加するとうまく遷移できるようになりました。
Rails.application.routes.draw do
  resources :users do
    resources :posts
  end
  resources :posts
end
Yuki
  • 良いURIの設計で重要な原則は、「覚えやすく、どんな機能を持つURIなのかがひと目でわかる」ことです。
# POSTリクエストで以下のURLにアクセスした場合、
# アクセスしたユーザーのポストを作成する
/users/user_id/posts
  • ログインした時に、投稿一覧ページになっていた方が良いので、redirect_toのパスを投稿一覧ページにしました。
redirect_back_or_to user_posts_path(@user), notice: 'Login successful'

参考

Simple Password Authentication-Sorcery

RESTful APIのURI設計(エンドポイント設計)