コメント機能の実装
commentモデルの作成
rails g model comment body:text user:references board:references
アソシエーションの追加(user.rb, board.rb)
has_many comments, dependent: :destroy
ルーティングの定義
resources :boards do
resources :comments, shallow: true
end
ルーティングをこのように定義することでどのboardに紐付いたcommentかをURLから判別できるようになる。
shallow: true
ネストすることによって長くなったURLを短くすることができる。
commentsコントローラーの作成
rails g controller comments
boards_controller
comments/_comment.html.erb
boards/show.html.erb
掲示板詳細画面の追加
以前作成した掲示板の機能に詳細画面を追加
boards_controller.rb
boards/show.html.erbの作成
掲示板一覧から詳細画面に遷移できるようにタイトルにlink_toメソッド を使う
掲示板の画像アップロード機能
Gemfileに追加
gem 'carrierwave'
gem 'mini_magick'
bundle installする
アップローダの作成
rails g uploader Board_Image
board_image_uploader.rbを作成
board_image_uploader.rb
def default_url デフォルトの画像を指定
'.png'
end
def extension_whitelist アップロードできる拡張子を制限
end
カラムの追加
マイグレーションファイル
add_column :boards, :board_image, :string
rails db:migrateを実行
Boardモデルにアップローダーの宣言
mount_uploader :board_iamge, BoardImageUploader
画像の入力フォームを追加
<div class="form-group">
<%= f.label :board_iamge%>
<%= f.file_field :board_image, class:'form-control mb-3', accept: 'image/*' %>
<%= f.hidden_field :board_image_cache %>
</div>
画像の表示
<%= image_tag board.board_image_url, class: 'card-img-top', size: '300x200' %>
フォーム入力時エラー情報を個別表示
掲示板作成の時に作ったform_withの中に
<%= render 'shared/_error_messages', object: f.object %>
を追加
_error_message.html.erb
掲示板作成機能
まずboards_controllerにnewアクション、createアクション、privateメソッドでboard_paramsを作成
def new
@board = Board.new
end
def create
@board = cuurent_user.boards.build(boards_params)
if @board.save
redirect_to boards_path
else
render :new
end
end
private
def board_params
params.require(:board).permit(:title, :body)
end
createアクションの@board = curent_user.boards.build(boards_params)は
current_userのidを持ったBoardを作成できる
フォームの作成
<%= form_with model: @board local:true do |f| %>
<%= f.label :title%>
<%= f.text_field :body%>
<%= f.label :body%>
<%= f.text_area :body%>
<% end %>
これで実装できました。
掲示板の一覧機能の実装
まずBoardモデルを作成(Userモデルと紐付けるため外部キーを保存できるカラムを設定する)
rails g model Board title:string body:text user:references
rails db:migrate
これでuser_idを保存できるカラムをもったBoardテーブルができました。
アソシエーションの設定
Board.rb belongs_to :user
Boardは1つのUserに属しているのでbelongs_to :user(単数形)
User.rb has_many :boards, dependent: :destroy
Userは複数のBoardを持っているのでhas_many :boards(複数形)
dependent: :destroy
Userモデルが削除された際に紐付いているBoardも削除する
次にバリデーションの設定
validates :title, presence: true, length:{ maximum: 100 }
validates :body, presence: true, length:{ maximum: 100 }
presence 空でないか検証
length:{ maximum: 100 } 値の長さの検証
コントローラーの作成
rails g controller boards
boards_controllerにindexアクションを作成して上のように取得する
@boardsを取得する際にincludesメソッドをする
includesメソッドを使用する理由はN+1問題を解消するため
あとはビューを作れば完成です!
デコレーターの導入
Gemfileに
gem 'draper'
を追加してbundle installする。
次にrails g draper:installを実行する
rails g draper:installを実行することによってrails g decorator モデル名が使えるようになる。
rails g decorator Userを実行することによってapp/decoratorsにuser_decoratorが作成される。
デコレーターにfull_nameメソッドを定義する
viewで
<% current_user.decorate.full_name %>
を記述することによって実装できる。