前提
ruby on railsで過去の出来事について投稿するSNSのようなものを製作しています。
postテーブルとcharacterテーブルがcharacters_postテーブルを介して多対多の関係になっています。
説明不足な部分があるかもしれないので、不明点がありましたら質問して頂けますと幸いです。
実現したいこと
- postのshowページで、postに関連したcaracterが存在する場合はcharacterのnameを一覧表示し、存在しない場合は「この話に登場人物は登録されていません」と表示したいです。
発生している問題
viewでif文を使った場合分けを書いたのですがうまく作動していないようで、
characterが登録されている場合は一覧表示され、登録されていない場合は空欄となっています。
エラーは出ていません。
該当のソースコード
1,post一覧ページのview
views/posts/index_private.html.erb
1<% @posts.each do |t| %> 2 <div class="post"> 3 <%= t.title %> 4 </div> 5 <%= link_to "詳細へ", show_private_post_path(t.id) %> 6 </div> 7 8 <% if user_signed_in? && current_user.id == t.user_id %> 9 <% end %> 10 11<% end %>
2,postの詳細ページのview
views/posts/show_private.html.erb
1 <p>登場人物一覧:</p> 2 <p> 3 <% @post.characters_posts.each do |t| %> 4 <% if t.present? %> 5 <p><%= t.character.name %></p> 6 <% else %> 7 <P>この話に登場人物は登録されていません</P> 8 <% end %> 9 <% end %> 10 </p>
3,コントローラー
posts_controller.rb
1 def index_private 2 @posts = Post.where(user_id: current_user.id).order(date: "ASC") 3 end 4 5 def show_private 6 @post = Post.find(params[:id]) 7 end
4,ルーティング
routes.rb
1resources :posts do 2 resources :likes, only: [:create, :destroy] 3 collection do 4 get :index_private, controller: 'posts', action: 'index_private' 5 get :index_public, controller: 'posts', action: 'index_public' 6 end 7 member do 8 get :show_private, controller: 'posts', action: 'show_private' 9 get :show_public, controller: 'posts', action: 'show_public' 10 end 11 end
5,モデル
models/post.rb
1has_many :characters_posts 2 has_many :characters, through: :characters_posts 3 belongs_to :user 4 5 validates :date, presence: true 6 validates :title, presence: true 7 validates :reason, presence: true 8 validates :experiment, presence: true 9 validates :review, presence: true 10 validates :setting, inclusion: {in: [true, false]}
models/character.rb
1 belongs_to :user 2 validates :name, presence: true, uniqueness: true 3 4 has_many :characters_posts 5 has_many :posts, through: :characters_posts
models/characters_post.rb
1 belongs_to :character 2 belongs_to :post
試したこと
現在表示されているpostのidと同じpost_idを持つデータがcharacters_postsテーブルに存在するかどうかを確かめればよいと考え、<% if t.present? %>という条件式を追加しました。
しかしこれでは「post_idが現在表示されているpostのidと一致するかどうか」という基準はつけられていない?ため、うまく機能していないのではないかと考えています。
回答1件
あなたの回答
tips
プレビュー