Ruby on Rails Tutorial (31)

こちらのリバース対応はこの連休で何とかならんかな、と言いつつ掘削開始。
Ruby on Rails Tutorial (30) で引用した通り、

Note that we can omit the user_url in the redirect, writing simply redirect_to @user to redirect to the user show page.

7.4.1 The finished signup form より引用
ということでググッても何も出てこなさげなのでそーゆー事だと思うことにします。
users#show な定義は以下になっています。

  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
  end

ええと、view を確認する前に paginate について確認。will_paginate な github の wiki 見るとそのまんまですね。
つうか、paginated query って何を戻すのか、がアレ。ここは別途確認の必要ありですね。view での出力は以下なカンジで

      <ol class="microposts">
        <%= render @microposts %>
      </ol>
      <%= will_paginate @microposts %>

will_paginate で page link が出力とのこと。とりあえず app/views/users/show.html.erb を少しづつ確認してみます。以下から。

<% provide(:title, @user.name) %>
<div class="row">
  <aside class="span4">
    <section>
      <h1>
        <%= gravatar_for @user %>
        <%= @user.name %>
      </h1>
    </section>
    <section>
      <%= render 'shared/stats' %>
    </section>
  </aside>

html5 なタグ的には

  • aside
  • section

あたり。あるいは shared/stats な partial も確認してみます。

shared/stats な partial 確認します。app/views/shared/_stats.html.erb ですね。こちらも少しづつ、ということで先頭部分が以下。

<% @user ||= current_user %>
<div class="stats">
  <a href="<%= following_user_path(@user) %>">
    <strong id="following" class="stat">
      <%= @user.followed_users.count %>
    </strong>
    following
  </a>

あ、ここは following および followers なナニですね。following_user_path な route が以下なカンジ。

following_user GET    /users/:id/following(.:format) users#following

ちょっといくつか控え。

  • users#following コントローラの確認
  • @user.followed_users 確認

ちょうどファイル開いてるので user な model から。定義が以下。

  has_many :followed_users, through: :relationships, source: :followed

む、relationship なソレってどうなってるんだったか状態だな。follower が follow してる方で followed がされてる方か。上の has_many だと relationship な model から followed なソレを、という事になるので user な id と follower な id が同じもの、という形になるのか。
このあたり Chapter 11 Following users の Figure 11.7 A model of followed users through user relationships. な図が分かりやすいですね。
あるいは user#following の定義が以下か。

  def following
    @title = "Following"
    @user = User.find(params[:id])
    @users = @user.followed_users.paginate(page: params[:page])
    render 'show_follow'
  end

render してるのは app/views/users/show_follow.html.erb なのか。ええと、根拠が以下なので

  <a href="<%= following_user_path(@user) %>">

このあたりは自分の情報、ってことになるのか。

<% provide(:title, @title) %>
<div class="row">
  <aside class="span4">
    <section>
      <%= gravatar_for @user %>
      <h1><%= @user.name %></h1>
      <span><%= link_to "view my profile", @user %></span>
      <span><b>Microposts:</b> <%= @user.microposts.count %></span>
    </section>

あるいは以下な section は何になるのかな。

    <section>
      <%= render 'shared/stats' %>
      <% if @users.any? %>
        <div class="user_avatars">
          <% @users.each do |user| %>
            <%= link_to gravatar_for(user, size: 30), user %>
          <% end %>
        </div>
      <% end %>
    </section>
  </aside>

shared/stats な partial は今見てるソレですが、following/followers ですね。@users は following なナニですね。アイコンがずらっと並ぶ、の図なのか。で、いっちゃん下の記述が以下。

  <div class="span8">
    <h3><%= @title %></h3>
    <% if @users.any? %>
      <ul class="users">
        <%= render @users %>
      </ul>
      <%= will_paginate %>
    <% end %>
  </div>
</div>

ここ、render @users がアレ。以下なのかなぁ。

        users GET    /users(.:format)               users#index          

なんか違うカンジ。app/views/users/user.html.erb っぽい。定義が以下。

<li>
  <%= gravatar_for user, size: 52 %>
  <%= link_to user.name, user %>
  <% if current_user.admin? && !current_user?(user) %>
    | <%= link_to "delete", user, method: :delete,
                                  data: { confirm: "You sure?" } %>
  <% end %>
</li>

むむ、何故にこれで paginate なナニが出力されるのか。ええと users_controller.rb で以下な形で @users に paginate なソレが代入されてて

    @users = @user.followed_users.paginate(page: params[:page])

show_follow.html.erb で以下な形。

    <% if @users.any? %>
      <ul class="users">
        <%= render @users %>
      </ul>
      <%= will_paginate %>
    <% end %>

記述が略せるようになった、ってことで良いのかどうか。続きは show.html.erb の以下な部分か。

  <div class="span8">
    <%= render 'follow_form' if signed_in? %>
    <% if @user.microposts.any? %>
      <h3>Microposts (<%= @user.microposts.count %>)</h3>
      <ol class="microposts">
        <%= render @microposts %>
      </ol>
      <%= will_paginate @microposts %>
    <% end %>
  </div>
</div>

とりあえずここでエントリ投入します。