今回はユーザーに紐づく投稿テーブルを作成することを考える。
モデルを作成
まずは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 %>
コメント