2010年12月20日月曜日

rails3 で Twitter のような「もっと読む」をつくる

かなり時間つかったのでメモメモ。

Comment.rb: (モデル)
  PerPage = 3
  scope :paginate,

    lambda { |page, per_page|
      page     = 1 if not page.present? or page <= 0
      per_page = PerPage if not per_page.present? or per_page <= 0
      limit = per_page
      offset = (page - 1) * limit


      limit(limit).offset(offset)
    }



CommentsController: (コントローラ)
def index
  @comments = Comment.paginate(params[:page].to_i, nil)
  if not params[:page].blank?
    @morepage = params[:page].to_i + 1 
  else
    @morepage = 2
  end
  @morepage = nil if Comment.paginate(params[:page].to_i+1, nil).count.zero?
  respond_with @comments
end


index.html.haml: (ビュー)

%div#comments
  - if @comments.blank?
    %p コメントないお。
  - else
    = render 'comments/comments'


= render 'comments/more'

_comments.html.haml:
- @comments.each do |comment|
  %ul
    %div{:id => "comment_"+comment.id.to_s}
      %li= comment.message

_more.html.haml:
- if @morepage
  %div#more
    %a.more= link_to "もっと読む", {:page => (@morepage)},
                                 :method => :get, :remote => true

index.js.rjs:
page.insert_html(:bottom, "comments", :partial => "comments/comments",
                 :locals => {:comments => @comments})
@comments.each do |comment|
  page["comment_" + comment.id.to_s].visual_effect :highlight
end
page.replace_html :more, :partial => "more"

なんでこんなに長くなるかねぇ…。

実際のコードから抽出したんで間違いなどあるかもですが、自分用なので良しとする!
それからページネーションは Will_paginate を使えばいいんじゃって話もありますが、ボク自身が link_to :remote の記法に慣れておきたかったことと、 RJS の何たるかをちょっとでも理解してから使いたかったからです。でもこの場合 Comment.next_page とかの定義がわからん。おかげでコントローラの中で「もっと読む」を表示するかどうか調べてるし、全体的にダサいのはあれですね、書いたやつのせいですね。

さて、とりあえず push しておきますかね…。


-- 押してねっ→BlogPeople「趣味の世界」ブログランキング --

0 件のコメント:

コメントを投稿