質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

ruby on railsでの非同期通信ができません

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 58

yamanba

score 9

現在、ruby on railsにてSNSを作成しています。いいね機能をつけたので、他のサービスのようにjQueryを使った非同期通信を行えるようにしたかったのですが、どうもうまくいきません。今の自分にはうまくいかない原因がさっぱりわかりませんので、どうかご教授いただければ幸いです。以下、いいね機能に関連したコードを記載しています。

# /config/routes.rb
Rails.application.routes.draw do
  root to: 'toppages#index'

  get 'login', to: 'sessions#new'
  post 'login', to: 'sessions#create'
  delete 'logout', to: 'sessions#destroy'

  get 'signup', to: 'users#new'
  resources :users do
    member do
      get :likes
    end
  end

  resources :posts, only: [:create, :destroy, :new, :show] do
    resources :comments, only: [:create, :destroy, :show, :index]
  end

  resources :relationships, only: [:create, :destroy]
  resources :favorites, only: [:create, :destroy]
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
# app/models/user.rb
class User < ApplicationRecord
  before_save { self.email.downcase! }
  validates :name, presence: true, length: { maximum: 50 }
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i },
                    uniqueness: { case_sensitive: false }
  has_secure_password

  has_many :posts, dependent: :destroy
  has_many :relationships, dependent: :destroy
  has_many :followings, through: :relationships, source: :follow
  has_many :reverses_of_relationship, class_name: 'Relationship', foreign_key: 'follow_id'
  has_many :followers, through: :reverses_of_relationship, source: :user

  has_many :rejects, dependent: :destroy
  has_many :refusals, through: :rejects, source: :reject
  has_many :reverses_of_reject, class_name: 'Reject', foreign_key: 'reject_id'
  has_many :refusers, through: :reverses_of_reject, source: :user

  has_many :favorites, dependent: :destroy
  has_many :likes, through: :favorites, source: :post, dependent: :destroy

  has_many :comments, dependent: :destroy

  def follow(other_user)
    unless self == other_user
      self.relationships.find_or_create_by(follow_id: other_user.id)
    end
  end

  def unfollow(other_user)
    relationship = self.relationships.find_by(follow_id: other_user.id)
    relationship.destroy if relationship
  end

  def following?(other_user)
    self.followings.include?(other_user)
  end

  def refuse(other_user)
    unless self == other_user
      self.rejects.find_or_create_by(reject_id: other_user.id)
    end
  end

  def unrefuse(other_user)
    reject = self.rejects.find_by(reject_id: other_user.id)
    reject.destroy if reject
  end

  def refusing?(other_user)
    self.refusals.include?(other_user)
  end

  def favorite(postFavorite)
    self.favorites.find_or_create_by(post_id: postFavorite.id)
  end

  def unfavorite(postFavorite)
    favorite = self.favorites.find_by(post_id: postFavorite.id)
    favorite.destroy if favorite
  end

  def favoritePost?(postFavorite)
    self.likes.include?(postFavorite)
  end

  mount_uploader :image, ImageUploader
end
# app/models/favorite.rb
class Favorite < ApplicationRecord
  belongs_to :user
  belongs_to :post
end
# app/controllers/favorites_controller.rb
class FavoritesController < ApplicationController

  before_action :require_user_logged_in

  def create
    post = Post.find(params[:post_id])
    current_user.favorite(post)
    flash[:success] = 'お気に入りに登録しました。'
  end

  def destroy
    post = Post.find(params[:post_id])
    current_user.unfavorite(post)
    flash[:success] = 'お気に入りから削除しました。'
  end
end
# app/views/favorites/_favorite_button.html.erb
<% if current_user.favoritePost?(post) %>
  <div class="button_wrapper">
    <%= form_with(model: current_user.favorites.find_by(post_id: post.id), id: "like-button", method: :delete) do |f| %>
      <%= hidden_field_tag :post_id, post.id %>
      <%= f.submit 'お気に入りから外す', class: 'btn btn-danger btn-sm favorite-button' %>
    <% end %>
  </div>
<% else %>
  <div class="button_wrapper">
    <%= form_with(model: current_user.favorites.build, id: "like-button") do |f| %>
      <%= hidden_field_tag :post_id, post.id %>
      <%= f.submit 'お気に入りに登録する', class: 'btn btn-primary btn-sm favorite-button' %>
    <% end %>
  </div>
<% end %>
# app/views/favorites/create.js.erb
$("#like-buttons").html("<%= j(render partial: 'favorite_button') %>");
# app/views/favorites/destroy.js.erb
$("#like-buttons").html("<%= j(render partial: 'favorite_button') %>");
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる