質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

1327閲覧

【JavaScript】タブを切り替えると中身が表示されなくなります

kumamin

総合スコア12

Ruby

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

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

1グッド

0クリップ

投稿2020/09/09 08:03

編集2020/09/09 09:05

前提・実現したいこと

今、RailsとJavaScriptを用いてCtoCで旅行の案内ができる人と案内してほしい人をマッチングさせるアプリを制作しておりまして、
旅行の案内をする人をツアーキャスト、旅行の案内を受ける人をツアーゲストと定義しています。
ユーザーは、ツアーキャストとしてもツアーゲストとしても投稿することができ、その投稿に対して他のユーザーが申し込むことができます。

今実現したいことは、そのアプリのマイページで、自分が投稿した投稿と申し込んだ投稿をタブの切り替えで見られるようにすることです。
ここでは、自分が投稿した投稿を@giving_post_○s、申し込んだ投稿を@taking_post_○sと定義しています。
また、○の部分にはツアーゲストの投稿の場合gが、ツアーキャストの投稿の場合はcが入ります。

画像のように左側に「投稿一覧」「申込済み」、
右側の上部に「ツアーゲストの投稿」「ツアーキャストの投稿」というタブをつくりました。

イメージ説明

例えば「申込済み」と「ツアーキャストの投稿」のタブをクリックすると、
申込済みの投稿の中でツアーキャストの投稿のみ表示されるようにしたいです。

実際にコードを書いてみたところ、投稿一覧はツアーゲストとツアーキャスト両方見られるのですが、
申込済みのツアーキャストの投稿が表示されません。
(そもそも表示させる投稿がない場合、「投稿がありません」と表示されるようにしているので、
うまく実装できていれば何も表示されないということはないはずです)
また、一度申込済みのツアーキャストの投稿をクリックすると申込済みのツアーゲストも表示されなくなってしまいます。

こちらの原因と解決方法を教えていただけないでしょうか?

該当のソースコード

▼views/users/show.html.haml

haml

1.Mypage_lower 2 - if user_signed_in? && @user.id == current_user.id 3 .Mypage_lower__Btns 4 = link_to "投稿一覧", "#", class: "Post_type_btn Active1" 5 = link_to "申込済み", "#", class: "Post_type_btn" 6 .User_page_tabs 7 = link_to "ツアーゲストの投稿", "#", class: "User_page_tab Active2" 8 = link_to "ツアーキャストの投稿", "#", class: "User_page_tab" 9 10 11 .Mypage_lower__Content.Show1 12 .User_posts.Show2 13 - if @giving_post_gs.empty? 14 .Empty 投稿がありません 15 - else 16 .Post_index 17 - @giving_post_gs.each do |post| 18 = render partial: "posts_g/post", locals: { post: post } 19 .User_posts 20 - if @giving_post_cs.empty? 21 .Empty 投稿がありません 22 - else 23 .Post_index 24 - @giving_post_cs.each do |post| 25 = render partial: "posts_c/post", locals: { post: post } 26 27 .Mypage_lower__Content 28 .User_posts.Show2 29 - if @taking_post_gs.empty? 30 .Empty 投稿がありません 31 - else 32 .Post_index 33 - @taking_post_gs.each do |post| 34 = render partial: "posts_g/post", locals: { post: post } 35 .User_posts 36 - if @taking_post_cs.empty? 37 .Empty 投稿がありません 38 - else 39 .Post_index 40 - @taking_post_cs.each do |post| 41 = render partial: "posts_c/post", locals: { post: post }

▼user.js

js

1$(function() { 2 let btns = $(".Post_type_btn"); 3 4 function btnSwitch() { 5 $(".Active1").removeClass("Active1"); 6 $(this).addClass("Active1"); 7 const index = btns.index(this); 8 $(".Mypage_lower__Content").removeClass("Show1").eq(index).addClass("Show1"); 9 } 10 btns.click(btnSwitch); 11}); 12 13$(function() { 14 let tabs = $(".User_page_tab"); 15 16 function tabSwitch() { 17 $(".Active2").removeClass("Active2"); 18 $(this).addClass("Active2"); 19 const index = tabs.index(this); 20 $(".User_posts").removeClass("Show2").eq(index).addClass("Show2"); 21 } 22 tabs.click(tabSwitch); 23});

▼user.scss

.Mypage_lower { position: relative; &__Btns { position: absolute; top: 50px; left: -120px; .Post_type_btn { color: gray; font-weight: bold; margin-bottom: 30px; display: block; } .Active1 { color: $orange1; } } .User_page_tabs { width: 880px; display: flex; justify-content: space-around; margin: 0 auto; margin-bottom: 15px; .User_page_tab { height: 33px; width: 170px; text-align: center; font-weight: bold; color: gray; } .Active2 { color: $orange1; border-bottom: solid 2px $orange1; } } .Mypage_lower__Content { display: none; .User_posts { display: none; } .Show2 { display: block; } } .Show1 { display: block; } }
necocoa👍を押しています

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

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

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

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

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

m.ts10806

2020/09/09 08:36

>show.html.haml 今回つけられたタグだけだとアドバイス付きづらいかと思いますが・・
kumamin

2020/09/09 08:51

ご指摘ありがとうございます。 タグを追加しました。
m.ts10806

2020/09/09 08:54

でしたら、タイトルに書かなくて良いですよ。 タグにある内容を再掲しても冗長になって要件部分が伝わりにくくなるだけなので。
kumamin

2020/09/09 09:04

かしこまりました。
guest

回答1

0

ベストアンサー

jQueryの詳しい挙動を知らないので、予想ですが、考察を落とします。

  1. Post_type_btnのどちらを押したか、をindexで取得する
  2. 一旦すべてdisplay: noneにする
  3. 1で取得したindexが1番目だった場合、Mypage_lower__Contentの1番目にclassを追加して表示する

という形だと思うのですが、

User_page_tabのリンクは2つに対し、User_postsはページ内に4つ存在します。
(投稿一覧と申込み済みのそれぞれに2つづつUser_postsが存在するため)

そのためindex0, 1である投稿一覧のツアーゲストとツアーキャストは切り替えできるが、
index2, 3である申込済のツアーゲストとツアーキャストを表示できないのだと思います。

jQueryの2個目のfunctionを変える必要がありますね。

投稿2020/09/09 10:17

necocoa

総合スコア209

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

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

kumamin

2020/09/09 11:04

おかげさまで、解決できました。 前回に引き続きご丁寧に回答していただき、大変助かりました。 ありがとうございます!
necocoa

2020/09/09 11:10

解決できてよかったです! JavaScriptのデバックはchromeのデベロッパーツールを使って、自分がやりたい挙動をしているかどうかなど確認してみると良いと思います! 今回だとHTMLを見て、リンクをクリックした時に自分が想定した部分にClassが付与されたかどうか、を確認してみたら発見できたかと思います。 これからも学習ファイトです!
kumamin

2020/09/09 11:32

なるほど! デベロッパーツールを使って自分でデバックできるようになれるよう、頑張ります。 誠にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問