2011年8月21日日曜日

rails thumbs_upをちょっとだけ試してみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

投票的な機能を付加することができるgem thumbs_upをちょっと試してみた。
機能として3つあるらしい

  1. acts_as_voteable : 記事やコメントなどをvoted対象にする
  2. acts_as_voter : ユーザーをvoterとする
  3. has_karma : カルマ的なもの


自分はさわりの部分だけでvoteableだけ試してみました。

gem
https://github.com/brady8/thumbs_up

・gemfileに以下を記述
gem 'thumbs_up'

・インストール
bundle install

・voteのmigration作成
rails generate thumbs_up

・テスト用
rails g scaffold question title:string
rake db:migrate

・vote用コントローラー
rails g controller vote voteup votedown


で、コードを以下のように記述

・モデルにvote機能を付加
class Question < ActiveRecord::Base
  acts_as_voteable
end

・questions_controllerのshow
  def show
    @question = Question.find(params[:id])
    @vote = @question.votes.build

・votes_controllerののcreate
  def create
    @vote = Vote.new(params[:vote])
    @vote.voteable_id=params[:vote][:voteable_id]
    @vote.voteable_type=params[:vote][:voteable_type]
    @question = Question.find(params[:vote][:voteable_id])

・モデルのvote.rb
validates_uniqueness_of :voteable_id, :scope => [:voteable_type, :voter_type, :voter_id]
をコメントアウト

・ビューのquestions/show.html.erb
<p id="notice"><%= notice %></p>

<p>
  <b>Title:</b>
  <%= @question.title %>
</p>
<p>
  <b>vote_count_up:</b>
  <%= @question.votes_for %>
</p>
<p>
  <b>vote_count_down:</b>
  <%= @question.votes_against %>
</p>
<%= form_for @vote do |f| %>
  <% if @vote.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@vote.errors.count, "error") %> prohibited this entry from being saved:</h2>
 
      <ul>
        <% @vote.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <h2>vote</h2>
  <div class="field">
    <%= f.radio_button:vote,"true",{:checked=>true} %>voteup<br/>
    <%= f.radio_button:vote,"false",{:checked=>false} %>votedown<br/>
    <%= f.hidden_field :voteable_id %>
    <%= f.hidden_field :voteable_type %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

<%= link_to 'Edit', edit_question_path(@question) %> |
<%= link_to 'Back', questions_path %>

・ルートの追加
resources :votes, :only => [:create]

で形はできたようだ。






















(titleが投票しくださいなってる・・・)
voteableのユニークをコメントアウトしないとvoteを1回しか登録できないというコードの中身を理解していないのとコードがごり押しすぎて変な感じがする。もっとシンプルな書き方があると思われる。
voterとkarmaの機能は試していない点を考えると使えるgemなのかなー
うーん、納得できていない。まだ自分には早いか
   

0 件のコメント:

コメントを投稿