以下の手順でイイね機能をつける時にNoMethodErrorが発生しました。
- Step1 モデル作成-
まずはじめに、テーブルの作成。
Cmd
1$ rails g model like article:references user:references 2$ rails db:migrate
次に、app/models/user.rbに追記。
class User < ApplicationRecord has_many :tweets, dependent: :destroy #追記箇所 has_many :likes, dependent: :destroy has_many :liked_tweets, through: :likes, source: :tweet #ここまで end
app/models/article.rbにも追記。
class Article < ApplicationRecord belongs_to :user #追記箇所 has_many :likes, dependent: :destroy has_many :liked_users, through: :likes, source: :user #ここまで end
そして、app/model/like.rbにバリエーションをつける。
class Like < ApplicationRecord belongs_to :user belongs_to :tweet #追記箇所 validates_uniqueness_of :tweet_id, scope: :user_id #ここまで end
次に def already_liked?について定義を。
class User < ApplicationRecord has_many :tweets, dependent: :destroy has_many :likes, dependent: :destroy has_many :liked_tweets, through: :likes, source: :post #追記箇所 def already_liked?(tweet) self.likes.exists?(tweet_id: tweet.id) end #ここまで end
-Step2 コントローラー作成-
まず、コントローラー作成。
Cmd
1$ rails g controller likes
つぎに、ルーティングを追記。
Rails.application.routes.draw do #変更前 resources :articles # #変更後 resources :articles do resources :likes, only: [:create, :destroy] end #
Likeコントローラーの中身の変更。
class LikesController < ApplicationController def create like = current_user.likes.create(tweet_id: params[:tweet_id]) #user_idとtweet_idの二つを代入 redirect_back(fallback_location: root_path) end def destroy like = Like.find_by(tweet_id: params[:tweet_id], user_id: current_user.id) like.destroy redirect_back(fallback_location: root_path) end end
articles_controller.rbのshowアクションに内容を追加していきます。
def show @article = Article.find(params[:id]) @like = Like.new end
-Step3 ビューの変更-
show.html.erbを以下のように書き換えます。
<h4>し か く ちゃんねる</h4> <h1>資格い頻道</h1> <div class="article"> <p><%= @article.user.email %></p> <h3><%= @article.body %></h3> <p><%= @article.created_at %></p> <h3>いいね件数: <%= @article.likes.count %></h3> <% if current_user.already_liked?(@article) %> <%=link_to article_like_path(@article), method: :delete do%> <i class="fas fa-heart"></i> <%end%> <% else %> <%=link_to article_likes_path(@article), method: :post do%> <i class="fas fa-heart"></i> <%end%> <% end %> </div> <h2>いいねしたユーザー</h2> <% @article.liked_users.each do |user| %> <li><%= user.email %></li> <% end %> <%= link_to "編集する", edit_article_path(@article.id) %> <%= link_to "一覧に戻る", articles_path %>
index.html.erbに以下を追記します。
(エラーメッセージによると13行目にNoMethodErrorが発生)
<h4>し か く ちゃんねる</h4> <h1>資格い頻道</h1> <h3>Article一覧</h3> <%= link_to "資格い頻道とは?", articles_top_path %> <%= link_to "新規投稿へ", new_article_path %> <div class="articles-container"> <% @articles.each do |t| %> <div class="article"> <%= t.title %><br> <%= t.content %><br> <%= t.category %><br> <%= t.user.email %><br> <% if current_user.already_liked?(t) %> <%=link_to article_like_path(id: t.id, article_id: t.id), method: :delete do%> <i class="fas fa-heart"></i><%=t.likes.count%> <%end%> <% else %> <%=link_to article_likes_path(id: t.id, article_id: t.id), method: :post do%> <i class="far fa-heart"></i><%=t.likes.count%> <%end%> <% end %> <%= t.created_at %><br> <br> </div> <% end %> </div>
回答1件
あなたの回答
tips
プレビュー