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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Ruby on Rails

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

解決済

Railsのview画面のif分岐が反映されない

Dizzyboy
Dizzyboy

総合スコア0

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Ruby on Rails

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

2回答

0評価

1クリップ

5268閲覧

投稿2019/12/29 14:46

Railsのviewにてif文を記述し、DBに値が入っている、いない、で表示を変更させたいのですが思うように変わってくれず、助力を頂きたく質問をいたします。

実行したいこと

index画面にてuserをeach do で一覧表示している中で、userテーブル以外のDBに入っている値を取得し、その値が入っているかいないかでif文で表示を分けようとしています。

確認したこと

画面をリロードした際に、ターミナルを確認するとuserテーブルとは別のテーブルのDBに入っている値は取得できているように思います。(見方があっていれば…)

コード

index.html.erb抜粋

html

<div class="employee__box"> <% @users.each do |user| %> <ul class="employee__box__list"> <%= render partial: "employee", locals: { user: user} %> </ul> <% end %> </div>

<%= render partial: "employee", locals: { user: user} %></ul>のrender部分

html

<% if @sch.present? %> <li class="employee__box__list__name", id="leave", data-user-id="<%=user.id%>"><%= user.name %></li> <% else %> <li class="employee__box__list__name_select", id="attend", data-user-id="<%=user.id%>"><%= user.name %></li> <% end %>

すべて
<li class="employee__box__list__name", id="leave", data-user-id="<%=user.id%>"><%= user.name %></li>の方で表示されてしまいます。

users_controller.rbのindexアクション

Rails

def index @users = User.all.order("id") @users.each do |user| @schedule = Schedule.find(user.schedules.ids.last) @sch = @schedule.out end end

コントローラーの@users = User.all.order("id")でuserの一覧を表示しています。
usersとschedulesはmodel側でhas_manyとbelongs_toでアソシエーションを組んでいます。

@schedule = Schedule.find(user.schedules.ids.last)により@scheduleでschedulesテーブルでそれぞれのuser_idを持つ、最後のレコードを取得しています。
@sch = @schedule.outはoutカラムを指定し、view側で<% if @sch.present? %>とすることで、schedulesテーブルのoutカラムの中に値が入っているか、いないか、で分岐させようとしています。

index画面をリロードした際に、ターミナルでの表示の詳細を見ると

terminal

Started GET "/" for ::1 at 2019-12-29 22:35:41 +0900 Processing by UsersController#index as HTML User Load (0.3ms) SELECT `users`.* FROM `users` ORDER BY id ↳ app/controllers/users_controller.rb:5 (0.3ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 1 ↳ app/controllers/users_controller.rb:6 Schedule Load (0.5ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 14 LIMIT 1 ↳ app/controllers/users_controller.rb:6 (0.5ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 2 ↳ app/controllers/users_controller.rb:6 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 5 LIMIT 1 ↳ app/controllers/users_controller.rb:6 (0.2ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 3 ↳ app/controllers/users_controller.rb:6 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 15 LIMIT 1 ↳ app/controllers/users_controller.rb:6 (0.2ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 4 ↳ app/controllers/users_controller.rb:6 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 18 LIMIT 1 ↳ app/controllers/users_controller.rb:6 (0.2ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 5 ↳ app/controllers/users_controller.rb:6 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 16 LIMIT 1 ↳ app/controllers/users_controller.rb:6 (0.2ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 6 ↳ app/controllers/users_controller.rb:6 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 17 LIMIT 1 ↳ app/controllers/users_controller.rb:6 (0.3ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 7 ↳ app/controllers/users_controller.rb:6 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 12 LIMIT 1 ↳ app/controllers/users_controller.rb:6 Rendering users/index.html.erb within layouts/application Rendered users/_header.html.erb (0.2ms) Rendered users/_employee.html.erb (0.5ms) Rendered users/_employee.html.erb (0.1ms) Rendered users/_employee.html.erb (0.0ms) Rendered users/_employee.html.erb (0.0ms) Rendered users/_employee.html.erb (0.0ms) Rendered users/_employee.html.erb (0.1ms) Rendered users/_employee.html.erb (0.1ms) Rendered users/index.html.erb within layouts/application (12.3ms) Completed 200 OK in 89ms (Views: 48.4ms | ActiveRecord: 9.4ms)

と表示され、
(0.3ms) SELECT schedules.id FROM schedules WHERE schedules.user_id = 1
で、@users = User.all.order("id")の一覧が表示され、Schedule Load (0.5ms) SELECT schedules.* FROM schedules WHERE schedules.id = 14 LIMIT 1
で、@schedule = Schedule.find(user.schedules.ids.last)の値が取得できているのが分かるのですが、上記viewのように設定してもifで分岐される表示になりません。

試したこと

html

<% if @sch.present? %> <li class="employee__box__list__name", id="leave", data-user-id="<%=user.id%>"><%= user.name %></li> <% else %> <li class="employee__box__list__name_select", id="attend", data-user-id="<%=user.id%>"><%= user.name %></li> <% end %>

<% if @sch.present? %><% if @sch.blank? %>にすると、全部 <li class="employee__box__list__name_select", id="attend", data-user-id="<%=user.id%>"><%= user.name %></li>側の表示になります。
present?、blank?の他に、<% if @sch.nil? %>では.blank?の時と同じくなりました。

controllerの@sch = @schedule.outの直下にbinding.pryを入れてリロードした場合、@schの値は取得できていて、@schの中には日時が入っています。そのため、あるか、ないかでtrue、falseの判定をさせて、falseの場合にelse側の表示をさせようとしておりますが、上記htmlのif文で分岐できておりません。
その理由が分からず、困っております。

エラーなどは出ず、.present?だと全部else前の表示になり、.blank?だと全部else後の表示になってしまう状態です。
何か、お気づきの点がございましたらご回答いただけましたら幸いです。
不明な点がありましたらコメントにてお伝えいただけましたら、ご提示いたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

KazuSaka
KazuSaka

2019/12/29 15:54 編集

気になるところがあっので… コントローラのIndexアクションの所ですが、 @usersには全ユーザーが入ってますが、@schにはeach文の最後のユーザーの日付データしか入ってないのでは?(上書きされるから) だから、ビューでは、ユーザー毎に処理しても、@schは毎回同じ値が使われるのでは? @schは配列にすべきかと思います。
Dizzyboy
Dizzyboy

2019/12/29 17:58

ご回答頂き、ありがとうございます。 @users.each do |user| @schedule = Schedule.find(user.schedules.ids.last) end のeachはuserは@schedule = Schedule.find(user.schedules.ids.last)をして、それぞれのuser_idを持っている、最後のschedule.idを取得するためにeachをかけております。(userが無いとuser.schedules.ids.lastでfindメソッドが使え無いのです…) 質問文内のterminalの表示をみる限りでは、user_idが1の時、schedule.idの14が取れてて、これがscheduleテーブル内でのuser_id1がついている、最後のレコードです。 今userは7名いて、それぞれに最後のレコードの値が付与されていますが、これが上書きされてしまっているということでしょうか? @schを配列にするという方法が、わかりません…調べてみたのですがmapメソッドというのを使えばよいのでしょうか? せっかくご回答をいただけたのに、理解が追いつかず申し訳ございません…。
KazuSaka
KazuSaka

2019/12/29 19:55

回答欄に私の考えを記載しました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Ruby on Rails

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