【Ruby on rails】外部キーの書き方

Ruby on Rails

今回はユーザーに紐づく投稿テーブルを作成することを考える。

スポンサーリンク

モデルを作成

まずはuser_idに紐づくpostモデルを以下のように作成

rails g model post user_id:integer title:string body:text image_id:string
      invoke  active_record
      create    db/migrate/20201105003556_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml

投稿モデルに1ユーザーにbelongs_toで紐づくことを明記する。

#/app/models/post.rb
class Post < ApplicationRecord
    belongs_to :user
    attachment :image
end

今度はユーザーモデルにhas_manyでユーザーに複数投稿があることを明記する。
※postsは複数形にすることに注意。

dependent: :destroyでユーザーが削除されたら紐づく投稿を削除することを明記

#/app/models/user.rb
class User < ApplicationRecord
  has_many :posts, dependent: :destroy
end

以下のようにマイグレーションファイルが作成されていることを確認

class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.integer :user_id
      t.string :title
      t.text :body
      t.string :image_id

      t.timestamps
    end
  end
end

確認して問題なければ、dbに反映する。

rails db:migrate

コントローラーを作成

以下のようなコマンドでコントローラーを作成しました。

今回はインデックス、詳細、新規投稿、編集を作成。

# rails g controller posts index show new edit
      create  app/controllers/posts_controller.rb
       route  get 'posts/index'
get 'posts/show'
get 'posts/new'
get 'posts/edit'
      invoke  erb
      create    app/views/posts
      create    app/views/posts/index.html.erb
      create    app/views/posts/show.html.erb
      create    app/views/posts/new.html.erb
      create    app/views/posts/edit.html.erb
      invoke  test_unit
      create    test/controllers/posts_controller_test.rb
      invoke  helper
      create    app/helpers/posts_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    js
      create      app/assets/javascripts/posts.js
      invoke    css
      create      app/assets/stylesheets/posts.css

サンプルなので新規作成のみ記載

class PostsController < ApplicationController
  def index
  end

  def show
  end

  def new
    @post = Post.new
  end

  def edit
  end
end

ルーティング

自動生成されたルーティングを削除し、ルーティングを追記する。

  resources :posts

ビューを作成

ビューは各々好きに作成して下さい。

参考までに新規作成だけ載せておきます。私は以下のように記載しました。

# app/views/posts/new.html.erb
<%= form_for @post do |f|%>
    <%= f.label :title %>
    <%= f.text_field :title %>

    <%= f.label :body %>
    <%= f.text_area :body %>

    <%= f.label :image %>
    <%= f.attachment_field :image %>

    <%= f.submit%>
<% end %>

フリーランスを目指すなら【テックパートナーズカレッジ】

未経験者向けWEBスクール【SHElikes】

コメント