前提・実現したいこと
現在SNSのようなアプリケーションを作っていて
投稿にタグ付けをできるように追加実装しています。
https://qiita.com/E6YOteYPzmFGfOD/items/bfffe8c3b31555acd51d
こちらの記事を参考に実装を進めていたのですが、
発生している問題・エラーメッセージ
NameError in Posts#index Showing /Users/mono/projects/rank_top/app/views/posts/index.html.erb where line #47 raised: uninitialized constant Post::TagRelationship Extracted source (around line #47): 45 </div> 46 47 <% post.tags.each do |tag| %> 48 <%= tag.tag_name %>49 50 <% end %>
のようなエラーが出てしまい
中間テーブルやアソシエーションに問題があると仮説を立てて解決しようとしましたが
解決法が分からず実装が止まってしまいました。
該当のソースコード
tag_relationship.rb class TagReletionship < ApplicationRecord belongs_to :post belongs_to :tag end
post.rb class Post < ApplicationRecord has_many :tag_relationship, dependent: :destroy has_many :tags, through: :tag_relationship end
tag.rb class Tag < ApplicationRecord has_many :tag_relationsship, dependent: :destroy has_many :posts, through: :tag_relationship validates :tag_name, uniqueness: true end
routes.rb Rails.application.routes.draw do devise_for :users root to: 'posts#index' resources :users, only: :show resources :posts do resources :comments, only: :create resource :likes, only: [:create, :destroy] collection do get 'search' end end end
posts.index.html.erb <%= form_with url: search_posts_path, method: :get, local: true do |form| %> <%= form.text_field :keyword, placeholder: "投稿を検索する", class: "search-input" %> <%= form.submit "検索", class: "search-btn" %> <% end %> <div class="row row-cols md-3"> <% @posts.each do |post| %> <div class="card d-flex justify-content-around m-5" style="width: auto; heigth: auto;"> <div class="card-body border border-primary"> <%= image_tag post.image, :width => '280', :height => '280' if post.image.attached? %> <h4 class="card-title"><%= post.title %></h4> 1位<p class="card-text"><%= post.rank1 %></p> 2位<p class="card-text"><%= post.rank2 %></p> 3位<p class="card-text"><%= post.rank3 %></p> <div class="btn-group"> <button type="button" class="btn btn-5m btn-outline-secondary"> <%= link_to '詳細', post_path(post.id) , method: :get %></button> <button type="button" class="btn btn-5m btn-outline-secondary"> <%=link_to post.user.name, user_path(post.user.id)%></button> </div> <div id="likes_buttons_<%= post.id %>"> <%= render partial: 'likes/like', locals: { post: post} %> </div> <p class="card-text"> <small class="text-muted"><%= post.updated_at %> </small> </p> </div> </div> <% post.tags.each do |tag| %> <%= tag.tag_name %> <% end %> <% end %> </div>
posts_contoroller.rb class PostsController < ApplicationController before_action :authenticate_user!, except: [:index, :show, :search] before_action :move_to_index, except: [:index, :show, :search] def index @posts = Post.includes(:user).order('created_at DESC') @likes = Like.where(user_id: current_user) end def new @post = Post.new end def create @post = Post.new(post_params) tag_list = params[:post][:tag_name].split(',') @post.likes_count = (0) if @post.save redirect_to root_path else render :new end end def show @post = Post.find(params[:id]) @comment = Comment.new @comments = @post.comments.includes(:user) end def edit @post = Post.find(params[:id]) @tag_list =@post.tags.pluck(:name).join(",") end def update @post = Post.find(params[:id]) tag_list = params[:post][:tag_ids].split(',') if @post.update(post_params) @post.save_tags(tag_list) redirect_to root_path else render :edit end end def destroy post = Post.find(params[:id]) post.destroy redirect_to root_path end def search @posts =Post.search(params[:keyword]) return nil if params[:input] == "" tag = Tag.where(['tag_name LIKE ?', "%#{params[:input]}%"]) end private def post_params params.require(:post).permit(:title, :rank1, :rank2, :rank3, :image, :likes_count).merge(user_id: current_user.id) end def move_to_index unless user_signed_in? redirect_to action: :index end end end
試したこと
リレーションに問題があると思い、参考記事を元にモデルとマイグレーションファイルを書き直しました。結果、同じエラーが出てしまっています。
備考
現在、タグ付けした投稿を作成、保存、一覧ページの表示を目標に実装しておりますが、
コントローラーのedit,update,searchに今後実装予定の物が含まれています。
質問投稿中に気付き、削除致しましたのでご了承ください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。