BETA

Rails Tutorialやってみた!41(13章-4)

投稿日:2019-05-11
最終更新:2019-05-11

100DaysOfCode 66/100

今日やること

  • マイクロポストの操作(投稿)

マイクロポストの操作

まずはマイクロポストを投稿する機能を実装していきます。

従来のRails開発の慣習と異なる箇所が1つあります。Micropostsリソースへのインターフェイスは、主にプロフィールページとHomeページのコントローラを経由して実行されるので、Micropostsコントローラにはnewやeditのようなアクションは不要ということになります。つまり、createとdestroyがあれば十分です。

マイクロポストには独立した投稿用ページや、編集機能は存在しません。また、ユーザーのように一つのマイクロポストに対応するようなViewもありません。

シンプルに作れるものはシンプルに作ることが大切です。

アクセス制御を作る

必ずユーザーに紐付いているマイクロポストの投稿や削除は、当然ログインしている状態でしか操作できないようにする必要があります。

これは10章でやった認可のお話と同様です!

Micropostsコントローラーからでもログイン状態を確認できるように、Usersコントローラー内にあるlogged_in_userメソッドをApplicationコントローラーに移します。

あとは10章と同様、before_actionを使ってlogged_in_userをアクションの前に実行すればOKです。

before_action :logged_in_user, only: [:create, :destroy]  

マイクロポスト作成ページ

先述した通り、マイクロポストには独立した投稿用ページ(ブログの記事投稿ページのようなもの)は用意しません

今回はログイン時のみ、トップページに投稿用フォームを表示するようにします。

したがって、newアクションに相当する@micropostインスタンス変数の定義はstatic_pagesコントローラのhomeアクションで行います。

class StaticPagesController < ApplicationController  
  def home  
    @micropost = current_user.microposts.build if logged_in?  
  end  
.  
.  

このあたりは以前オリジナルアプリで躓いた箇所でもありますが、おかげでもう大丈夫です!

pluralizeメソッド

続いてビューの話です。
マイクロポストの総数をサイドバーに表示するときに厄介なのが、英語の複数形です。

<span><%= pluralize(current_user.microposts.count, "micropost") %></span>  

このようにpluralizeというメソッドを使えば、単純に数値を表示したとき1 micropostsのように単数なのに複数形になってしまうといった問題を簡単に解決できます。すごいですね!

日本語のアプリでは使う機会はそれほど多くないかもしれませんが、デザインとして英語を使ったり多言語対応を意識する場面はあると思うので、覚えておいて損はありません。

error_messagesのリファクタリング

<% @user.errors.full_messages.each do |msg| %>  

ユーザーに渡される情報が誤っていたときに、自動でエラーを生成してくれる便利なメソッドです。これをマイクロポストでも使いたいときは……。

<% object.errors.full_messages.each do |msg| %>  

このように(例えば)objectという変数を使って、メソッドを呼び出す際に引数を受け取るようにすれば@userに限らずともerror_messagesを使えるようになります。

form_for(@user) do |f|  

便利なことに、form_forの対象であるフォーム変数f.objectという形で表すことができます。

@userのフォームであればf.object@user@micropostのフォームであればf.object@micropostです。

<%= render 'shared/error_messages', object: f.object %>  

error_messagesを呼び出す際に、都度f.objectを参照するようにすればOKです!
これも一つの抽象化ですね。

※本文でも説明がありますがobjectf.objectを渡さないとメソッドが使えなくなるので、忘れずに全箇所修正します。

終わりに

オリジナルアプリ作成時に既に試しているはずなのですが、f.objectの話はこんなのやったっけとなってしまったことを白状します。
人は忘れる!!ということを再認識しました……笑

せっかくこれまでやってきた内容も放っておけばボロボロ抜け落ちていくと思うので、書籍「現場Rails」なども使って繰り返し学習し、自分の実力として定着させていきたいです。

次回以降やること

  • フィードの原型を作る
  • マイクロポストを削除する
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@tammcの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!