

サイト( <http://qiita.com/YuitoSato/items/94913d6a349a530b2ea2>
)を参考に実装しているのですが、2点わからないことがあります。回答よろしくお願い致します。

  1. サイトではcreate.js.erb、destroy.js.erbとありますが、erbを使わずjsで書く場合、どのようになるのか教えていただきたいです。
  2. また、create.js.erb、destroy.js.erbを一つにまとめて書いた場合どのようになるのでしょうか。

現状ですが、この2点がわからず下記のように非同期処理ではない状態で実装しており、  
非同期をのぞいて正常に動いています。  
※いいねのアイコンは、Font-Awesomeのfa-thumbs-o-upを使用しています。

↓show.html.erb

[code]

              <% if answer.like?(current_user) %>
                <%= link_to like_path(@likes, answer_id: answer.id), method: :delete do %>
                  <i class="fa fa-thumbs-o-up"></i></a>
                  <span>
                    <%= answer.like_count %>
                  </span>
                <% end %>
              <% else %>
                <%= link_to likes_path(answer_id: answer.id), method: :post do %>
                  <i class="fa fa-thumbs-o-up"></i></a>
                  <span>
                    <%= answer.like_count %>
                  </span>
                <% end %>
              <% end %>
    
[/code]

↓answer.rb

[code]

    def like_count
        likes=Like.where(answer_id:self)
        likes.count
    end
    def like?(current_user)
        Like.where(user_id:current_user.id,answer_id:id)
    end
    
[/code]

↓questions_controller.rb

[code]

    def show
        @answers = Answer.enable_answer.where(question_id: @question.id)
        @category = Category.find_by(id: @question.category_id)
        @favorite = Favorite.find_by(user_id: current_user.id, question_id: @question.id)
        @likes = Like.where(answer_id: params[:answer_id])
    end
    
[/code]

↓likes_controller.rb

[code]

    class LikesController < AuthorizedController
      before_action :set_answer
      after_action :set_likes
    ​
      def create
        like = Like.new(user_id: current_user.id, answer_id: params[:answer_id])
        like.save
        redirect_to question_path(@answer.question_id)
      end
    ​
      def destroy
        like = Like.find_by(user_id: current_user.id, answer_id: params[:answer_id])
        like.destroy
        redirect_to question_path(@answer.question_id)
      end
    ​
      private
    ​
      def set_answer
        @answer = Answer.find(params[:answer_id])
      end
    ​
      def set_likes
        @likes = Like.where(answer_id:params[:answer])
      end
    
[/code]

↓answer_controller.rb

[code]

      def show
        @answer = Answer.find(params[:id])
        @likes = Like.where(prototype_id: params[:id])
      end
    
[/code]


CC BY-SA 3.0
2017-06-03T11:43:46.743
35251
2018-03-30T02:40:36.923
23421
question
javascript ruby-on-rails ruby
railsのいいね機能をjavascriptを使った非同期処理にしたい


このいいねの実装方法は今風ではないので、ReactもしくはVue.jsを使う方法を考える事をおすすめします。

カジュアルに実装するならわたしはこうします

# 実装方法

JavaScript界隈は変化が激しい界隈なので、細かい実装方法は省いています。基本的な使い方は公式サイトに詳しく載っているので、見てみてください。

## サーバーサイド

  * 1 rails g controller api/likes
  * 2 api/likes controllerのcreate actionにいいね機能を実装
  * 3 api/likes controllerのdestroy actionにいいねを外す機能を実装

## View

  * count数の表示機能実装
  * いいねボタンのボタン実装

## JS側

  * 1 いいねボタンが押された場合にapi/likes controllerにリクエストを投げる機能を実装
  * 2 1が押された場合にcount upとcount downする機能を実装

# 所感

本来ならこういう実装するのであればRails 5から実装されているAPI
modeと静的なHTML/CSS/JSで実装するのが一番よいとわたしは考えているのですが、とりあえずRailsだけで出来る実装方法を書きました。

# FYI

  * <https://jp.vuejs.org>


CC BY-SA 3.0
2017-06-05T18:15:08.083
35318
2017-06-05T18:15:08.083
7373
35251
answer