Hatena::Diary

牌語備忘録 このページをアンテナに追加 RSSフィード

2008-09-10

レイルに乗ってみた〜Rails of Ruby on Rails その08「タグクラウドも簡単に〜第3章終了(つдT)」

レイルに乗ってみた〜 目次

書籍『Rails of Ruby on Rails ~Case of LOCUSANDWONDERS.COM~』で勉強してみた(p110〜)

タグクラウド機能 プラグインインストール

gitからacts_as_taggable_on_steroidsをインストール

~/work/locus $ script/plugin install git://github.com/mattetti/acts_as_taggable_on_steroids.git
removing: /Users/username/work/locus/vendor/plugins/acts_as_taggable_on_steroids/.git
Initialized empty Git repository in /Users/username/work/locus/vendor/plugins/acts_as_taggable_on_steroids/.git/
remote: Counting objects: 46, done.        
remote: Compressing objects: 100% (41/41), done.        
remote: Total 46 (delta 3), reused 40 (delta 2)        
Receiving objects: 100% (46/46), 17.77 KiB, done.

ジェネレータでタグ関連ファイルを生成

~/work/locus $ script/generate acts_as_taggable_migration
      exists  db/migrate
      create  db/migrate/20080910103308_acts_as_taggable_migration.rb
Loaded suite script/generate
Started

Finished in 0.00041 seconds.

0 tests, 0 assertions, 0 failures, 0 errors

タグ関連テーブルを作成

マイグレーション実行でtagsとtaggings二つのテーブル作成される。

~/work/locus $ rake db:migrate
(in /Users/username/work/locus)
== 20080910103308 ActsAsTaggableMigration: migrating ==========================
-- create_table(:tags)
   -> 0.0077s
-- create_table(:taggings)
   -> 0.0067s
-- add_index(:taggings, :tag_id)
   -> 0.0039s
-- add_index(:taggings, [:taggable_id, :taggable_type])
   -> 0.0046s
== 20080910103308 ActsAsTaggableMigration: migrated (0.0246s) =================

Loaded suite /opt/local/bin/rake
Started

Finished in 0.000434 seconds.

0 tests, 0 assertions, 0 failures, 0 errors

以下躓くとこも無く、ほぼ書籍のままなので略


スタイルシートを変更

書籍で表記されてる「公開」は「public」のこと

public/stylesheets/blog.css

ブラウザで確認(http://localhost:3000/entries

一覧表示が逆順になった。

f:id:CortYuming:20080910195943p:image

f:id:CortYuming:20080910195942p:image

メモ

  • 駆け足で『Chapter 03 ブログの作成』終了。
  • インストール関係以外は、善くも悪くも細かい説明が無いからスムーズに進められる感じ。
  • Chapter 04も一通り動かしてから、また最初から細部を見て行く予定。とりあえず先進んでみる。
  • Railsは使いたい機能をプラグインで追加して作り上げるの理解でOK?
  • 自分みたいな初心者は『いたさんのブログ』さんが和訳された『Four Days on Rails日本語版』とかで予習しておくのが吉(読んでてよかった)



RoRのrakeでいろいろできるらしい

マイグレーション関連のRakeタスクの再確認 - ひげろぐ 』さんより

いろいろ便利そう。後で調べてみる(゚Д゚)


レイルに乗ってみた〜Rails of Ruby on Rails その07「トラックバックは覚え書き程度で(つдT)」

レイルに乗ってみた〜 目次

書籍『Rails of Ruby on Rails ~Case of LOCUSANDWONDERS.COM~』で勉強してみた(p102〜)

トラックバック機能

躓くとこも無く、ほぼ書籍のまま。これまでの作業を繰り返してる感じ。

なので、気になったとこだけメモ。詳細は書籍を参照。

スキャフォールドでベース生成

~/work/locus $ script/generate scaffold Trackback title:string: excerpt:text url:string blog_name:string entry:references
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/trackbacks
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      exists  public/stylesheets/
      create  app/views/trackbacks/index.html.erb
      create  app/views/trackbacks/show.html.erb
      create  app/views/trackbacks/new.html.erb
      create  app/views/trackbacks/edit.html.erb
      create  app/views/layouts/trackbacks.html.erb
overwrite public/stylesheets/scaffold.css? (enter "h" for help) [Ynaqdh] n
        skip  public/stylesheets/scaffold.css
      create  app/controllers/trackbacks_controller.rb
      create  test/functional/trackbacks_controller_test.rb
      create  app/helpers/trackbacks_helper.rb
       route  map.resources :trackbacks
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/trackback.rb
      create    test/unit/trackback_test.rb
      create    test/fixtures/trackbacks.yml
      exists    db/migrate
      create    db/migrate/20080910062530_create_trackbacks.rb
Loaded suite script/generate
Started

Finished in 0.000447 seconds.

0 tests, 0 assertions, 0 failures, 0 errors

マイグレーション実行

~/work/locus $ rake db:migrate
(in /Users/username/work/locus)
== 20080910062530 CreateTrackbacks: migrating =================================
-- create_table(:trackbacks)
   -> 0.0375s
-- add_column(:entries, :trackbacks_count, :integer, {:default=>0})
   -> 0.0262s
-- add_index(:trackbacks, :entry_id)
   -> 0.0077s
== 20080910062530 CreateTrackbacks: migrated (0.0725s) ========================

Loaded suite /opt/local/bin/rake
Started

Finished in 0.000448 seconds.

0 tests, 0 assertions, 0 failures, 0 errors

保存時に加工処理を追加

app/models/trackback.rbを修正

ネステッドルート

ここ削除でよいよね?

  map.resources :trackbacks

トラックバック機能をブラウザで確認してみた

f:id:CortYuming:20080910163402p:image

f:id:CortYuming:20080910163401p:image

メモ

script/generate〜やrake〜などは、eshellとか同一のウインドウで処理すると見直し楽かも。




レイルに乗ってみた〜Rails of Ruby on Rails その06「間違い箇所見つけた(つдT)」

レイルに乗ってみた〜 目次

書籍『Rails of Ruby on Rails ~Case of LOCUSANDWONDERS.COM~』で勉強してみた(p093〜)

コメント機能 ベースを生成

スキャッフォールドジェネレータでコメント機能のベースを自動生成

(途中scaffold.cssを上書きするか訊いてくるからNOで。overwrite public/stylesheets/scaffold.css? (enter "h" for help) [Ynaqdh] n)

~/work/locus $ script/generate scaffold Comment name:string email:string url:string content:text entry:references
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/comments
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      exists  public/stylesheets/
      create  app/views/comments/index.html.erb
      create  app/views/comments/show.html.erb
      create  app/views/comments/new.html.erb
      create  app/views/comments/edit.html.erb
      create  app/views/layouts/comments.html.erb
overwrite public/stylesheets/scaffold.css? (enter "h" for help) [Ynaqdh] n
        skip  public/stylesheets/scaffold.css
      create  app/controllers/comments_controller.rb
      create  test/functional/comments_controller_test.rb
      create  app/helpers/comments_helper.rb
       route  map.resources :comments
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/comment.rb
      create    test/unit/comment_test.rb
      create    test/fixtures/comments.yml
      exists    db/migrate
      create    db/migrate/20080910014516_create_comments.rb
+Loaded suite script/generate
Started

Finished in 0.000414 seconds.

0 tests, 0 assertions, 0 failures, 0 errors

マイグレーションファイルを修正

db/migrate/20080910014516_create_comments.rbに

def self.upに追加(書籍と違いファイル名が「修正日+_create_comments.rb」になる。なぜ?)

    add_column :entries, :comments_count, :integer, :default => 0
    add_index :comments, :entry_id

def self.downに追加

    remove_column :entries, :comments_count
    remove_index :comments, :entry_id

マイグレーション実行

~/work/locus $ rake db:migrate
(in /Users/username/work/locus)
== 20080910014516 CreateComments: migrating ===================================
-- create_table(:comments)
   -> 0.0269s
-- add_column(:entries, :comments_count, :integer, {:default=>0})
   -> 0.0212s
-- add_index(:comments, :entry_id)
   -> 0.0579s
== 20080910014516 CreateComments: migrated (0.1127s) ==========================

Loaded suite /opt/local/bin/rake
Started

Finished in 0.00045 seconds.

0 tests, 0 assertions, 0 failures, 0 errors

モデルの修正 モデル間の関連付け

app/models/comment.rbに追加

  belongs_to :entry, :counter_cache => true

app/models/entry.rbに追加

  has_many :comments,   :order => "created_at ASC"

バリデーションを追加

app/models/comment.rbに追加

  validates_presence_of :name, :email, :content
  validates_format_of :email, 
  :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i

ネステッドルート

config/routes.rbを修正

「map.resources ::trackbacks」を削除とあるけど、もともと書いて無かった。見落とした?

  #map.resources :entries
  map.resources :entries, :has_many => [:comments, :trackbacks]

このtrackbacksって次のトラックバック機能で追加するのでは?(書籍の間違い?)

コントローラの修正 親データを常にロードする

app/controllers/comments_controller.rbに追加と置換

  before_filter :load_entry
  before_filter :login_required, :except => [:index, :show, :new, :create]
:
      format.html { redirect_to(@entry) }
:
private
  def load_entry
    @entry = Entry.find(params[:entry_id])
  end

置換

  1. 「Comment.」を「@entry.comments.」に置換する(親データに依存するコメントをロード)
  2. 「redirect_to(@comment)」を「redirect_to(@entry)」に置換する(リダイレクト先を親データの記事頁に変更)

バリデーションエラー時の出力チテンプレートを変更

またapp/controllers/comments_controller.rbに修正

        #format.html { render :action => "new" }
        format.html { render :template => "entries/show" }

コメント機能を記事に書き込む 記事毎のコメント数を表示

間違い箇所見つけた

p098に書いてあるファイル名(index.thml.erb)が間違ってるようなので、サポートサイトから落としたのサンプル中身を書籍に載ってるコード「 entry_path(entry)」でマルチファイル検索してみた。(Emacsgrepで)

M-x grep-find
Run find (like this): find . -type f -exec grep -nH -e "  entry_path(entry)" {} /dev/null \;

検索結果

./locus/app/views/entries/_entry.html.erb:2:  <%= link_to h(entry.title), entry_path(entry) %>
./locus/app/views/entries/_entry.html.erb:14:      entry_path(entry) + '#comments') %> | 
./locus/app/views/entries/_entry.html.erb:16:      entry_path(entry) + '#trackbacks' %> |
./locus/app/views/entries/_entry.html.erb:23:  <%= link_to '編集', edit_entry_path(entry) %>

_entry.html.erbを修正するみたい。

app/views/entries/_entry.html.erbに追加する部分

<dd>
  <%= link_to( "Comments (#{entry.comments_count})", 
      entry_path(entry) + '#comments') %> | 
</dd>

記事にコメント表示

app/views/entries/show.html.erbに追加

サンプルの

<dd id="comments"></dd>

を間に入れる

記事にコメントフォーム追加

app/views/entries/show.html.erbに追加

サンプルの

<dd id="add_comment"></dd>

を間に入れる

f:id:CortYuming:20080910124659p:image

f:id:CortYuming:20080910124658p:image

f:id:CortYuming:20080910124700p:image

メモ

インストールとか無ければ躓くとこはあまりなさそう。