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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

解決済

ログインしていいね機能を実現したい。likes.where(user_id: user.id).exists?

honda-gentuki
honda-gentuki

総合スコア21

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1回答

0評価

0クリップ

137閲覧

投稿2022/05/09 15:37

編集2022/05/10 10:15

前提

Railsでいいね機能を実装しています。
いいね機能を実装中にログアウトボタンを押したら下記のエラーメッセージが発生しました。

実現したいこと

  • いいね機能の実装。
  • 正常にログイン、ログアウト出来るようにすること。

発生している問題・エラーメッセージ

エラーメッセージ

NoMethodError in Posts#index Showing /Users/********/projects/********/app/views/likes/_like.html.erb where line #1 raised: undefined method `id' for nil:NilClass def liked_by?(user) likes.where(user_id: user.id).exists? end with_options presence: true do

該当ソースコード

config/routes.rb

Rails.application.routes.draw do devise_for :users, controllers: { registrations: 'users/registrations' } root 'posts#index' resources :posts do resources :comments, only: [:create, :destroy] resource :likes, only: [:create, :destroy] end resources :users, only: :show end

app/models/like.rb

class Like < ApplicationRecord belongs_to :user belongs_to :post validates_uniqueness_of :post_id, scope: :user_id end

app/models/post.rb

class Post < ApplicationRecord belongs_to :user, optional: true has_many :comments, dependent: :destroy has_one_attached :image has_many :likes, dependent: :destroy has_many :users, through: :likes def liked_by?(user) likes.where(user_id: user_id).exists? end with_options presence: true do validates :subject validates :course validates :unit validates :teaching_materials end validates :introduction, length: { maximum: 300 } validates :development, length: { maximum: 1000 } validates :summary, length: { maximum: 300 } with_options numericality: { only_integer: true, less_than_or_equal_to: 50 } do validates :introduction_time validates :development_time validates :summary_time end end

app/models/user.rb

class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :posts, dependent: :destroy has_many :comments, dependent: :destroy has_many :likes, dependent: :destroy has_many :posts, through: :likes with_options presence: true do validates :nickname validates :password_confirmation, format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: 'には英字と数字の両方を含めて設定してください' }, if: :password_required? validates :last_name, format: { with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/, message: 'には全角文字を使用してください' } validates :first_name, format: { with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/, message: 'には全角文字を使用してください' } validates :last_name_kana, format: { with: /\A[ァ-ヶー-]+\z/, message: 'には全角カナを使用してください' } validates :first_name_kana, format: { with: /\A[ァ-ヶー-]+\z/, message: 'には全角カナ文字を使用してください' } end def update_without_current_password(params, *options) params.delete(:current_password) if params[:password].blank? && params[:password_confirmation].blank? params.delete(:password) params.delete(:password_confirmation) end result = update(params, *options) clean_up_passwords result end def soft_delete update_attribute(:deleted_at, Time.current) end def active_for_authentication? super && !deleted_at end def inactive_message !deleted_at ? super : :deleted_account end end

app/views/likes/_like.html.erb

<% if post.liked_by?(current_user) %> <%= link_to(post_likes_path(post), method: :delete, remote: true, id: :"like-button-#{post.id}") do %> <i class="fa-lg fas fa-heart icon-btn liked"></i> <%= post.likes.count %> いいね <% end %> <% else %> <%= link_to(post_likes_path(post), method: :post, remote: true, id: :"like-button-#{post.id}") do %> <i class="fa-lg fas fa-heart icon-btn not-like"></i> <%= post.likes.count %> いいね <% end %> <% end %>

試したこと

def liked_by?(user) likes.where(user_id: user.id).exists? end

の2行目を
likes.where(user_id: @user).exists?
にすることでログインはできたのですが、いいね機能が正常に実装されなくなります。
お力添えいただきたいです。どうかよろしくお願いいたします。

良い質問の評価を上げる

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

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

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

気になる質問をクリップする

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

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

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

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

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

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

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。