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 も確認してみます。
- asideタグ
- http://www.html5.jp/tag/elements/aside.html
- どうもセクションを表現するものみたい。
- section タグ
- http://www.html5.jp/tag/elements/section.html
- こちらも名前そのまんま、ですね
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>
とりあえずここでエントリ投入します。