2011年8月20日土曜日

rails acts_as_commentableでコメント作成を試してみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
acts_as_commentableはコメント作成するときにいろいろやってくれるらしい。
早速やってみました。

本家
https://github.com/jackdempsey/acts_as_commentable


ここのuseを見ると

・コメントを付加するモデルに記述して
class Post < ActiveRecord::Base
acts_as_commentable
end

・コメントを追加
commentable = Post.create
commentable.comments.create(:title => "First comment.", :comment => "This is the first comment.")

・コメントを取得する。
commentable = Post.find(1)
comments = commentable.comments.recent.limit(10).all

といった具合にできるみたいです。

titleやuser_idの属性もあるみたいで、各ユーザー毎のコメントを取得したり
コメントにtitleをつけることも想定されているようです。

ここにgemの構造的な説明と使い方の例をが説明されてました。
http://www.arailsdemo.com/posts/16

英訳の練習で雑ですが訳してみました。訳的なもの
実際にこれにそってやってみました。(幾分ソースを省いています)


・gemfileに追加gem 'acts_as_commentable'

・インストールbundle install

・コメント用DB、モデル作成
rails generate comment

・テスト用postの作成
rails g scaffold post title:string
rake db:migrate

・コメントコントローラを作成 createメソッドを作成
rails g controller comment create


ここから各ファイルの内容
・model/post.rb
class Post < ActiveRecord::Base
  acts_as_commentable
end

・comment_controller
class CommentsController < ApplicationController
  def create
    @commentable = Comment.find_commentable(params[:comment][:commentable_type], params[:comment][:commentable_id])
    if @commentable
      @comment = @commentable.comments.build(params[:comment])
      if @comment.save
        redirect_to show_page_url, :notice => "Thanks for the comment."
      else
        flash.now[:alert] = "You had some errors for your comment."  # edited 10/28/10 use 'flash.now' instead of 'flash'
        render_error_page
      end
    else
      redirect_to root_url, :alert => "You can't do that."
    end
  end


  private
  def show_page_url
    case @commentable.class.name
    when "Post" then post_url(@commentable)
    else @commentable
    end
  end

  def render_error_page
    model_name = @commentable.class.name
    instance_variable_set("@#{model_name.downcase}", @commentable)
    render "#{model_name.underscore.downcase.pluralize}/show"
  end

end

・posts_controllerのshowメソッド
def show
    @post = Post.find(params[:id])
    @comment = @post.comments.build
    @post.comments.pop
 
    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @post }
    end
  end

・view/comments/_form.html.erbにコメント入力フォームのテンプレート作成
  <div class="field">
    <%= f.label :comment %><br />
    <%= f.text_area :comment %>
    <%= f.hidden_field :commentable_id %>
    <%= f.hidden_field :commentable_type %>
  </div>

・view/post/show.html.erbにコメント表示部分と作成部分を追加

<table>
  <tr>
    <th>comment</th>
  </tr>

<% @post.comments.each do |comment| %>
  <tr>
     <td><%= comment.comment %> </td>
  </tr>
<% end %>
</table>

<%= render 'comments/form' %>

・ルートを追加
resources :comments, :only => [:create]

で、コードはできあがり。

localhost/postsから新しい記事を作成して、作成された記事のshowリンクをクリック
コメント表示欄にコメントを入力してcreateボタンを押せば、記事毎のコメントを表示できました。
コメント機能は自作でもできそうですがあると便利ですね。






0 件のコメント:

コメントを投稿