LoginSignup
14
12

More than 5 years have passed since last update.

Ruby on Rails で vote (like, dislike, unvote) 出来るアプリケーションを作る (acts_as_votable)

Last updated at Posted at 2015-05-31

>>> デモサイトはこちらです <<<

>>> 参考:Bootstrapの開発環境を自動的に作る <<<

このアプリケーションでは、ユーザーはLike、Dislike、またはUnvote出来る機能を追加したいと思います。

Screen Shot 2015-05-31 at 23.48.46.png

Gemfile
gem 'acts_as_votable'
gem 'devise'

ユーザー登録を作成

Deviseをインストール:

rails g devise:install

ユーザーモデルを作る:

rails g devise User

ユーザー登録のリンクを付ける
app/views/layouts/application.html.slim
- if user_signed_in?
  li Signed in as #{current_user.email}
  li = link_to 'Sign out', destroy_user_session_path, method: :delete
- else
  li = link_to 'Sign up', new_user_registration_path
  li = link_to 'Sign in', new_user_session_path

記事を作成

ArticleのScaffoldを作る

rails g scaffold Article title content:text

データベースをマイグレート:

rake db:migrate

これからVoteのシステムを作ります

config/routes.rb
  resources :articles do
    member do
      put 'like'    => 'articles#like'
      put 'dislike' => 'articles#dislike'
      put 'unvote'  => 'articles#unvote'
    end
  end

ユーザーはVoteします

app/models/user.rb
acts_as_voter

記事はVoteされます

app/models/article.rb
acts_as_votable
app/controllers/articles_controller.rb
  before_action :set_article, only: [:show, :edit, :update, :destroy, :like, :dislike, :unvote]

  def like
    @article.liked_by current_user
    redirect_to @article, notice: "You liked this!"
  end

  def dislike
    @article.disliked_by current_user
    redirect_to @article, notice: "You disliked this!"
  end

  def unvote
    @article.unvote_by current_user
    redirect_to @article, notice: "You unvoted this!"
  end

記事に関するメソッド:

Voteを数える:@article.votes_for.size

Likeを数える:@article.get_likes.size

Dislikeを数える:@article.get_dislike.size

Likeされたユーザー:@article.votes_for.up.by_type(User).voters

Dislikeされたユーザー:@article.votes_for.down.by_type(User).voters

ユーザーに関するメソッド:

Likeしたかどうかを確認:current_user.voted_up_on? @article

Dislikeしたかどうかを確認:current_user.voted_down_on? @article

Likeした記事:current_user.votes.up.for_type(Article).votables

Dislikeした記事:current_user.votes.down.for_type(Article).votables

app/views/articles/show.html.slim
= link_to 'Like', like_article_path(@article), method: :put
= link_to 'Dislike', dislike_article_path(@article), method: :put
= link_to 'Unvote', unvote_article_path(@article), method: :put
14
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12