こちらのURLを参照しながら、「いいね」機能の実装を試みています。
https://qiita.com/nojinoji/items/2c66499848d882c31ffa
しかし、「いいね」機能を実装しようとしているビューで下記のエラーが出てしまっています。
該当するエラー(22行目)で「message_likes_path」を「message_like_path」に変えてみたり、「,method: :post」などを加えてみたりしたのですが、エラーが変わりませんでした。
ビューファイルは下記のようになっています。
%h3 いいね件数: #{@message.likes.count} - if current_user.already_liked?(@message) = button_to 'いいねを取り消す', message_like_path(@message), method: :delete - else = button_to 'いいね', message_likes_path(@message) %h2 いいねしたユーザー - @message.liked_users.each do |user| %li= user.email = link_to "ホームへ戻る", messages_path
コントローラーは下記です。
インスタンス変数の使い方が違うのかなとも思ったのですが、エラーは変わりませんでした。
class MessagesController < ApplicationController def index @message = Message.new @messages = current_user.messages end def create @message = current_user.messages.new(message_params) if @message.save redirect_to user_messages_path(current_user), notice: 'メッセージが送信されました' else @messages = current_user.messages flash.now[:alert] = 'メッセージを入力してください。' render :index end end private def message_params params.require(:message).permit(:content, :image).merge(user_id: current_user.id) end end
アドバイスを頂ければ幸いでございます。
【9/26更新】
上記エラー文に「undefined method `message_likes_path'」 とあったので、pathを調べるために、rails routesを確認しました。
Prefix Verb URI Pattern Controller#Action new_user_session GET /users/sign_in(.:format) devise/sessions#new user_session POST /users/sign_in(.:format) devise/sessions#create destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy new_user_password GET /users/password/new(.:format) devise/passwords#new edit_user_password GET /users/password/edit(.:format) devise/passwords#edit user_password PATCH /users/password(.:format) devise/passwords#update PUT /users/password(.:format) devise/passwords#update POST /users/password(.:format) devise/passwords#create cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel new_user_registration GET /users/sign_up(.:format) devise/registrations#new edit_user_registration GET /users/edit(.:format) devise/registrations#edit user_registration PATCH /users(.:format) devise/registrations#update PUT /users(.:format) devise/registrations#update DELETE /users(.:format) devise/registrations#destroy POST /users(.:format) devise/registrations#create root GET / messages#index user_message_likes POST /users/:user_id/messages/:message_id/likes(.:format) likes#create user_message_like DELETE /users/:user_id/messages/:message_id/likes/:id(.:format) likes#destroy user_messages GET /users/:user_id/messages(.:format) messages#index POST /users/:user_id/messages(.:format) messages#create edit_user GET /users/:id/edit(.:format) users#edit user PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update
prefixに「user_message_likes」とあったので、「message_likes_path」を「user_message_likes_path」に変更しました。また追加で、引数を最上部の配列の「m」に変更し、viewファイルを下記のようにしました。
.messages - @messages.each do |m| .message .takerface %img{alt: "userface", src: "https://imgc.eximg.jp/i=https%253A%252F%252Fs.eximg.jp%252Fexnews%252Ffeed%252FRen_ai%252FRen_ai_188420_6aed_1.jpg,zoom=600,quality=70,type=jpg"}/ .contents .takername = m.user.name + " さんへ" .letter - if m.content.present? %p.lower-message__content = m.content .credo #仕事好き #親身心 #人生を変える .like %h3 いいね件数: #{m.likes.count} - if current_user.already_liked?(m) = button_to 'いいねを取り消す', user_message_like_path(m), method: :delete - else = button_to 'いいね', user_message_likes_path(m) %h2 いいねしたユーザー - m.liked_users.each do |user| %li= user.email = link_to "ホームへ戻る", messages_path
【9/27更新】
モデルのコードは下記となります。上から「Message」「User」「Like」です。
class Message < ApplicationRecord belongs_to :user validates :content, presence: true has_many :likes has_many :liked_users, through: :likes, source: :user end
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :name, presence: true, uniqueness: true has_many :messages has_many :likes has_many :liked_messages, through: :likes, source: :message def already_liked?(message) self.likes.exists?(message_id: message.id) end end
class Like < ApplicationRecord belongs_to :message belongs_to :user validates_uniqueness_of :message_id, scope: :user_id end
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 01:00
2020/09/27 01:05
2020/09/27 01:14
2020/09/27 05:52
2020/09/27 06:23