Ruby on Rails Tutorial (22)
まだまだ先は長い模様。
11.1.5 Followers
User#folowers な属性追加な模様。あるいは逆引きができたりする模様。とりあえずどんどん進めてみます。spec/models/user_spec.rb に試験追加。
it { should respond_to(:followed_users) } it { should respond_to(:reverse_relationships) } it { should respond_to(:followers) } it { should respond_to(:following?) }
あるいは "following" なブロックに以下を追加。
it { should be_following(other_user) } its(:followed_users) { should include(other_user) } describe "followed user" do subject { other_user } its(:followers) { should include(@user) } end
reverse_relationships および followers という属性 (というかメソド) の追加確認と follower の確認ですね。なんか面白い。
List 11.16 で実装が出てるんですが以下か。
has_many :reverse_relationships, foreign_key: "followed_id", class_name: "Relationship", dependent: :destroy has_many :followers, through: :reverse_relationships, source: :follower
とりあえず試験 red を確認しておいて確認。ちなみに relationships の定義が以下ですね。
has_many :relationships, foreign_key: "follower_id", dependent: :destroy has_many :followed_users, through: :relationships, source: :followed
class_name なソレを指定するのはデフォだと ReverseRelationship というクラスを探しに行くから、とのこと。むむ。名前で自動ってのもそれなりにルールを理解できてないと色々微妙ですね。
これで試験 green かと思ったら本体に盛り込んでなかった。リトライして green 確認してます。
11.2 A web interface for following users
いくつかの機能を盛り込んで 11.3 で user の status な feed を盛り込んで完了とのこと。
11.2.1 Sample following data
あ、イマサラですが rake な task って lib/tasks に云々なのか。ここも別途確認させて頂く必要がありますね。ここでは lib/tasks/sample_data.rake に Listing 11.17 の内容を盛り込むとのこと。長いので引用は略します。
更新したら以下。
$ bundle exec rake db:reset $ bundle exec rake db:populate $ bundle exec rake db:test:prepare
db:populate なソレは以下がその所以だったんすね。
namespace :db do desc "Fill database with sample data" task populate: :environment do
lib/tasks か。gitlab あたりも確認してみたい。つうか db:populate がオチたぞ。あ、以下になってた (汗
def make_relationsips
とほほすぎる。もっかい最初からやり直して無事終了。
11.2.2 Stats and a follow form
profile および Home な partial を、とのことなのかな。follow/unfollow なフォームを云々する前に表示を、ということらしい。なんかへろへろなのでテキストが読めないな。config/routes.rb 先頭部分を以下に修正。
SampleApp::Application.routes.draw do resources :users do member do get :following, followers end end
で、spec/requests/static_pages_spec.rb の修正が云々、とありますね。"for signed in users" なソレに追加なのか。
describe "for signed-in users" do let(:user) { FactoryGirl.create(:user) } before do FactoryGirl.create(:micropost, user: user, content: "Lorem") FactoryGirl.create(:micropost, user: user, content: "Ipsum") sign_in user visit root_path end it "should render the user's feed" do user.feed.each do |item| page.should have_selector("li##{item.id}", text: item.content) end end describe "follower/following counts" do let(:other_user) { FactoryGirl.create(:user) } before do other_user.follow!(user) visit root_path end it { should have_link("0 following", href: following_user_path(user)) } it { should have_link("1 followers", href: followers_user_path(user)) } end end end
"follower/following counts" なブロック追加、なのかな。とりあえず試験 red を確認。て red どころか例外吐いてるぞ。標準エラーを確保してみたら config/routes.rb が微妙でした。
resources :users do member do get :following, followers
となってましたorz
修正して試験 red を確認。
1) Static pages Home page for signed-in users follower/following counts Failure/Error: it { should have_link("0 following", href: following_user_path(user)) } expected link "0 following" to return something # ./spec/requests/static_pages_spec.rb:57:in `block (5 levels) in <top (required)>' 2) Static pages Home page for signed-in users follower/following counts Failure/Error: it { should have_link("1 followers", href: followers_user_path(user)) } expected link "1 followers" to return something # ./spec/requests/static_pages_spec.rb:58:in `block (5 levels) in <top (required)>'
かなり限界気味なんですがどんどん進めてみます。app/views/shared/_stats.html.erb は新規作成ですね。Listing 11.20 を追加とのこと。following および followers のカウントおよびそのページへのリンク、という形になってます。
で、app/views/static_pages/home.html.erb に shared/stats な render を追加してますね。
<aside class="span4"> <section> <%= render 'shared/user_info' %> </section> <section> <%= render 'shared/stats' %> </section> <section> <%= render 'shared/micropost_form' %> </section> </aside>
あるいは app/assets/stylesheets/custom.css.scss に Listing 11.22 なナニを追加とのこと。この節、盛り込みボリューム多すぎですね。app/views/users/_follow_form.html.erb を Listing 11.23 の内容で新規作成。
あと、config/routes.rb に relationships な resource が追加とのこと。
resources :relationships, only: [:create, :destroy]
あるいは app/views/_follow.html.erb を以下で
<%= form_for(current_user.relationships.build(followed_id: @user.id)) do |f| %> <div><%= f.hidden_field :followed_id %></div> <%= f.submit "Follow", class: "btn btn-large btn-primary" %> <% end %>
あるいは app/views/_unfollow.html.erb が以下で新規作成。
<%= form_for(current_user.relationships.find_by_followed_id(@user), html: { method: :delete }) do |f| %> <%= f.submit "Unfollow", class: "btn btn-large" %> <% end %>
これらのフォームの hidden な field 確認の必要あり。
上記盛り込みな app/views/users/show.html.erb 修正なのかな。Listing 11.27 で云々。このあたり。
<aside class="span4"> <section> <h1> <%= gravatar_for @user %> <%= @user.name %> </h1> </section> <section> <%= render 'shared/stats' %> </section>
11.2.3 Following and followers pages
もう少し頑張ってみます。この節末端で試験 green らしいので。
まず、spec/requests/authentication_pages_spec.rb について、Listing 11.28 を盛り込み。あるいは spec/requests/user_pages_spec.rb について Listing 11.29 を盛り込みます。末端にざっくり盛り込みなんですね。
試験 red 確認とかスルーで次に app/controllers/users_controller.rb に Listing 11.30 を盛り込みます。もう一つ、app/views/users/show_follow.html.erb を Listing 11.31 で新規作成。
これで試験 green って記述があるんですが本当かなぁ。
試験パスしとる
ここ、特に色々再確認の必要あり、ですね。
今日は色々な意味でへろへろなのでこれで終了。