読者です 読者をやめる 読者になる 読者になる

牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

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

Rails

レイルに乗ってみた〜 目次
書籍『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>

を間に入れる



メモ

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