前提・実現したいこと
プログラミングスクールに通うプログラミング初心者です。
現在、ruby on rails でイベント投稿アプリを開発しています。
このアプリは、ユーザーがイベントを開催したいと考えた際に、イベント投稿を行い参加したい人を集うことができます。
そして、その投稿を見た他のユーザーはその投稿に対して、エントリーすることで参加したいという意思表明ができるようなアプリを作っています。
今回解決したいこととしましては、
エントリーを行う際に同じ投稿に対して何度も同じユーザーがエントリーできるのは困るため、一度エントリーしたユーザーは二度目のエントリーができないようにしたい。
また、viewにあるエントリーというボタンを、エントリーしていない状態であれば表示させるが、エントリーしているイベントに対しては、エントリーボタンが消えエントリー済みという文字列を表示させたい。
です。
今回は、イベントの詳細ページにエントリーボタンを設置しています。このエントリーボタンを押すと、entries#newという新規エントリーページにいく実装となっています。
発生している問題・エラーメッセージ
今の段階では、制限がかけられていないため、エントリー済みのイベントのviewにエントリーボタンがあり、2度目のエントリーができてしまう。
データベース・テーブル情報
![イベント投稿のテーブル](3d3c1231159a361948961680b351dc97.png) ![ユーザー管理テーブル](f63fd57245834f0921bf59328e01d1ce.png) ![エントリー情報テーブル](9f0472fabb2e60182429db77e1d555fb.png)
(routes.rb) Rails.application.routes.draw do devise_for :users root to: 'home#top' resources :users resources :events do resources :comments, only: :create resources :entries, only: [:index, :new, :create] end end 入子構造になっています。
(events_controller.rb) #エントリーの詳細ページに関わらないと判断し、省略しました。 (省略) def show @entrys = Entry.all @event = Event.find(params[:id]) @comment = Comment.new @comments = @event.comments.includes(:user) end (省略)
(show.html.erb)イベント詳細画面のビューです。 <% if @event.user_id != current_user.id %> <%= link_to 'エントリーへ', new_event_entry_path(@event.id), method: :get , class: "nav-link ms-1 text-dark" %> <p>エントリー者数:<%= @event.entries.count %></p> <% else %> <p>エントリー者数:<%= @event.entries.count %></p> <p>エントリー者一覧</p> <% @entrys.each do |entry| %> <% if entry.event_id == @event.id %> <div> <%= link_to user_path(entry.user_id), method: :get do %> <%= entry.j_family_name %> <%= entry.j_last_name %> <% end %> 性別:<%= entry.sex %> 学年:<%= entry.entry_school_year %><br> <%= entry.entry_comment %> </div> <% end %> <% end %> <% end %>
(entry.rb)モデル class Entry < ApplicationRecord belongs_to :user belongs_to :event end
(event.rb) class Event < ApplicationRecord (#省略) belongs_to :user has_many :comments has_many :entries (#省略) end
(user.rb) class User < ApplicationRecord (#省略) has_many :events, dependent: :destroy has_many :comments, dependent: :destroy has_many :entries, dependent: :destroy has_many :events, through: :entries end
試したこと
if文の中にifというよくない形ということは承知で、エントリーボタンを表示させる条件として、「自分の投稿でない && 一度もエントリーしていない」としようと考えたが、自分の投稿でないというのは<% if @event.user_id != current_user.id %>と考えることができたが、そのユーザーが一度エントリーしていたらエントリーボタンを表示させないようにする記述方法がわからなかった。
補足
インデントが揃っておらず無駄な記述も多いためとても見にくいコードかと思います。これから、勉強を進めていく中で、マシなコードが書けるよう努力しますので、アドバイスいただけると幸いです。
回答2件
あなたの回答
tips
プレビュー