Rails tutorial 13章 ~Micropost実装~

おはようございます。

keuikeです。

今日から待ちに待ったRails tutorial 13章 マイクロポストの実装に入っています。

ようやく、Twitterっぽくなってきてテンション上がってます。笑

では、今日もいつも通り要約をまとめたのでご覧ください。

1.Micropostモデル

早速モデルから作成していきます。

Micropostモデルには投稿内容を表すcontent属性とuser_id属性の2つを実装します。

Rails g model Micropost content:text user:references

このuser:referencesがポイントでこの方のおかげで自動的にインデックスと外部キー参照付きのuser_idが追加され、UserとMicropotが関連つけする準備ができました。

それではmigrateをしましょう。

次にバリデーションんを実装します。

以下の2つです。

1.user_idが空になっていない。

2. contentが空でないかつ文字数が140字以内である

これらをMicropost.rbに書いていきます。

以上でバリデーションは完了です。

次にモデル間の関係について説明しようと思います。

今回のアプリでは一人のユーザーがたくさんの投稿をできるようになっています。

そういった場合、各モデルには次のように表す必要があります。

User.rb

has_many :microposts

Micropost.rb

belongs_to :user

これで関連付けは完了です。

また、関連付けが完了したので

micropost.create
micropost.new

と言った記述は

user.microposts.create
user.microposts.build

と言う感じに直す必要があります。

次にMicropostを新しい順に並び替えます。

その為に「desc」というものを使います。

これは降順(descending)の意を用い新しいものから並べます。

micropost.rb

default_scope -> { order(created_at: :desc) }

また、userが削除された時投稿も削除されていなければなりません。

User.rb

has_many :microposts, dependent: :destroy

ここまで出来ましたらUserの詳細ページに投稿を載せていきます。

ここで気をつけることは、users_controllerのshowアクションでmicropostインスタンスを取得することです。

Users_controller.rb

def show
  @microposts = @user.microposts.page(params[:page])
end

users/show.html.erb

<div class="col-md-8>
  <% if @user.microposts.any? %>
    <h3>Microposts(<%= @user.microposts.count %>)</h3>
    <ol class="microposts>
      <%= render @microposts %>
    </ol>
    <%= paginate @microposts %>
  <% end %>
</div>

_micropost.html.erb

<li id="micropost-<%= micropost.id %>">
  <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %>
  <span class="user"><%= link_to micropost.user.name, micropost.user %></span>
  <span class="content><%= micropost.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(micropost.created_at) %> ago.
  </span>
</li>

<%= render ‘microposts’ %>で各投稿を表示するパーシャルを呼び出します。

最後にホーム画面に投稿を表示させるようにします。

その為にやるべきことは以下の3つです。

1.Userモデルにfeedメソッドを書く。

2.feed_itemsのインスタンス変数を加える

3.フィード用のパーシャルを作成する。

次のようになります。

User.rb

def feed
  Micropsost.where("user_id = ?", user.id)

static_pages_controller.rb

def home
  if logged_in?
    @microposts = current_user.microposts.build
    @feed_items = current_user.feed.page(params[:page])
  end
end

_feed.html.erb

<% if @feed_items.any? %>
  <ol class="microposts>
    <%= render @feed_items %>
  </ol>
  <%= paginate @feed_items %>
<% end %>

これでフィードも作成完了しました。

ふぅ〜。

疲れました笑

最後まで見て頂きありがとうございました!!!

ここ違うよ、もっとこうした方がいいよなどの意見があればぜひコメントお願いします!!!!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です