Railsのviewにてif文を記述し、DBに値が入っている、いない、で表示を変更させたいのですが思うように変わってくれず、助力を頂きたく質問をいたします。
実行したいこと
index画面にてuserをeach do で一覧表示している中で、userテーブル以外のDBに入っている値を取得し、その値が入っているかいないかでif文で表示を分けようとしています。
確認したこと
画面をリロードした際に、ターミナルを確認するとuserテーブルとは別のテーブルのDBに入っている値は取得できているように思います。(見方があっていれば…)
コード
index.html.erb抜粋
html
1 <div class="employee__box"> 2 <% @users.each do |user| %> 3 <ul class="employee__box__list"> 4 <%= render partial: "employee", locals: { user: user} %> 5 </ul> 6 <% end %> 7 </div>
<%= render partial: "employee", locals: { user: user} %></ul>のrender部分
html
1<% if @sch.present? %> 2 <li class="employee__box__list__name", id="leave", data-user-id="<%=user.id%>"><%= user.name %></li> 3 <% else %> 4 <li class="employee__box__list__name_select", id="attend", data-user-id="<%=user.id%>"><%= user.name %></li> 5<% end %>
すべて
<li class="employee__box__list__name", id="leave", data-user-id="<%=user.id%>"><%= user.name %></li>
の方で表示されてしまいます。
users_controller.rbのindexアクション
Rails
1 def index 2 @users = User.all.order("id") 3 @users.each do |user| 4 @schedule = Schedule.find(user.schedules.ids.last) 5 @sch = @schedule.out 6 end 7 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
1Started GET "/" for ::1 at 2019-12-29 22:35:41 +0900 2Processing by UsersController#index as HTML 3 User Load (0.3ms) SELECT `users`.* FROM `users` ORDER BY id 4 ↳ app/controllers/users_controller.rb:5 5 (0.3ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 1 6 ↳ app/controllers/users_controller.rb:6 7 Schedule Load (0.5ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 14 LIMIT 1 8 ↳ app/controllers/users_controller.rb:6 9 (0.5ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 2 10 ↳ app/controllers/users_controller.rb:6 11 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 5 LIMIT 1 12 ↳ app/controllers/users_controller.rb:6 13 (0.2ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 3 14 ↳ app/controllers/users_controller.rb:6 15 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 15 LIMIT 1 16 ↳ app/controllers/users_controller.rb:6 17 (0.2ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 4 18 ↳ app/controllers/users_controller.rb:6 19 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 18 LIMIT 1 20 ↳ app/controllers/users_controller.rb:6 21 (0.2ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 5 22 ↳ app/controllers/users_controller.rb:6 23 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 16 LIMIT 1 24 ↳ app/controllers/users_controller.rb:6 25 (0.2ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 6 26 ↳ app/controllers/users_controller.rb:6 27 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 17 LIMIT 1 28 ↳ app/controllers/users_controller.rb:6 29 (0.3ms) SELECT `schedules`.`id` FROM `schedules` WHERE `schedules`.`user_id` = 7 30 ↳ app/controllers/users_controller.rb:6 31 Schedule Load (0.2ms) SELECT `schedules`.* FROM `schedules` WHERE `schedules`.`id` = 12 LIMIT 1 32 ↳ app/controllers/users_controller.rb:6 33 Rendering users/index.html.erb within layouts/application 34 Rendered users/_header.html.erb (0.2ms) 35 Rendered users/_employee.html.erb (0.5ms) 36 Rendered users/_employee.html.erb (0.1ms) 37 Rendered users/_employee.html.erb (0.0ms) 38 Rendered users/_employee.html.erb (0.0ms) 39 Rendered users/_employee.html.erb (0.0ms) 40 Rendered users/_employee.html.erb (0.1ms) 41 Rendered users/_employee.html.erb (0.1ms) 42 Rendered users/index.html.erb within layouts/application (12.3ms) 43Completed 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
1<% if @sch.present? %> 2 <li class="employee__box__list__name", id="leave", data-user-id="<%=user.id%>"><%= user.name %></li> 3 <% else %> 4 <li class="employee__box__list__name_select", id="attend", data-user-id="<%=user.id%>"><%= user.name %></li> 5<% 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後の表示になってしまう状態です。
何か、お気づきの点がございましたらご回答いただけましたら幸いです。
不明な点がありましたらコメントにてお伝えいただけましたら、ご提示いたします。
回答2件
あなたの回答
tips
プレビュー