🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

Q&A

解決済

2回答

1081閲覧

自分がエントリー済みの投稿にエントリーボタンを表示させないようにするには?

kokemaru2427

総合スコア8

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

0グッド

0クリップ

投稿2021/02/24 02:54

前提・実現したいこと

プログラミングスクールに通うプログラミング初心者です。
現在、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 %>と考えることができたが、そのユーザーが一度エントリーしていたらエントリーボタンを表示させないようにする記述方法がわからなかった。

補足

インデントが揃っておらず無駄な記述も多いためとても見にくいコードかと思います。これから、勉強を進めていく中で、マシなコードが書けるよう努力しますので、アドバイスいただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/02/24 02:58

マークダウンのcode内では他のマークダウンは無効になるので外に出してください。投稿前にプレビュー確認すればわかるはず。 あと、code内は「コード」のみを提示してください。それ以外はノイズになります。 また、「インデントが揃っておらず」など自覚があるのでしたら最大限調整されては如何でしょうか。 質問は編集できますので、一度にすべてやりきる必要はないですが、要件とは外れる内容を書いても、それもまたノイズになるので、避けられたほうが良いです。
kokemaru2427

2021/02/24 04:16

ご指摘ありがとうございます。 「インデントが揃っておらず」など学びを後回しにしていた自分の悪い部分であると反省しました。 マークダウンの書き方や質問の仕方に関しても知識を入れようと思います。ありがとうございました。
m.ts10806

2021/02/24 04:20

既に書いたように質問は編集できます
guest

回答2

0

<% unless @event.entries.map(&:user_id).include? current_user.id or @event.user_id == current_user.id %> とすることで解決。

投稿2021/02/24 04:21

kokemaru2427

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

やることは2つあります。

  1. 復数出来ないように制限を書ける
  2. viewに参加ボタンを出さない

前者はvalidationを研究してください。
この質問は後者ですね。

<%= link_to 'エントリーへ', を unlessで囲みます。
unless @event.entries.map(&:user_id).include? current_user.id

投稿2021/02/24 03:04

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokemaru2427

2021/02/24 04:19

この前に引き続き解決していただき本当にありがとうございます。 validationの部分は研究します! viewの方は、アドバイスの記述で解決できました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問