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

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

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

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

Ruby

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

Q&A

解決済

1回答

1375閲覧

Rails 条件分岐 ログインユーザーのみ自分の名前を確認でき、別のユーザーであれば名前を表示させない

muraishi

総合スコア17

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2020/02/16 07:33

予約表を作っているのですが、ログインユーザーにだけ予約表でユーザーの名前を表示させたいです。
他のユーザーにはユーザーの名前でなく”予約済み”と表示させるような条件分岐を書きたいです。

自分なりに考え、試しに、

view

1<% @time0900 = "予約済みです" if !(@time0900 == current_user)%>

とviewに書いてみたのでが、うまくいきませんでした。

あと、条件分岐はviewにもかけると思うのですが、こういう分岐はコントローラーに書く方が良いのでしょうか?

よろしくお願いします。

view

1 <tr> 2 <td>9:00~9:30</td> 3 <% if @time0900.count == 4 %> 4 <% @time0900.each do |f| %><td><%= f.user_name %></td><% end %> 5 6 <% elsif @time0900.count == 3 %> 7 <% @time0900.each do |f| %><td><%= f.user_name %></td><% end %><td>予約可能です</td> 8 9 <% elsif @time0900.count == 2 %> 10 <% @time0900.each do |f| %><td><%= f.user_name %></td><% end %><td>予約可能です</td><td>予約可能です</td> 11 12 <% elsif @time0900.count == 1 %> 13 <% @time0900.each do |f| %><td><%= f.user_name %></td><% end %><td>予約可能です</td><td>予約可能です</td><td>予約可能です</td> 14 15 <% else %><td>予約可能です</td><td>予約可能です</td><td>予約可能です</td><td>予約可能です</td><% end %> 16 </tr>

controller

1class TimetablesController < ApplicationController 2 def timetable_index 3 @timetables = Timetable.all 4 @time0900 = Timetable.where(hour: "9", minute: "00") 5 @time0930 = Timetable.where(hour: "9", minute: "30") 6 @time1000 = Timetable.where(hour: "10", minute: "00") 7 @time1030 = Timetable.where(hour: "10", minute: "30") 8 @time1100 = Timetable.where(hour: "11", minute: "00") 9 @time1130 = Timetable.where(hour: "11", minute: "30") 10 @time1200 = Timetable.where(hour: "12", minute: "00") 11 @time1230 = Timetable.where(hour: "12", minute: "30") 12 @time1500 = Timetable.where(hour: "15", minute: "00") 13 @time1530 = Timetable.where(hour: "15", minute: "30") 14 @time1600 = Timetable.where(hour: "16", minute: "00") 15 @time1630 = Timetable.where(hour: "16", minute: "30") 16 @time1700 = Timetable.where(hour: "17", minute: "00") 17 @time1730 = Timetable.where(hour: "17", minute: "30") 18 @time1800 = Timetable.where(hour: "18", minute: "00") 19 @time1830 = Timetable.where(hour: "18", minute: "30") 20 @time1900 = Timetable.where(hour: "19", minute: "00") 21 @time1930 = Timetable.where(hour: "19", minute: "30") 22 end 23 24 def new 25 @timetable = Timetable.new 26 end 27 28 def create 29 @timetable = Timetable.new(user_id: current_user.id, user_name: current_user.name, date: timetable_params[:date], hour: timetable_params[:hour], minute: timetable_params[:minute]) 30 if @timetable.save 31 flash[:success] = "ご予約ありがとうございます" 32 redirect_to root_path 33 else 34 flash[:success] = "申し訳ございません。予約を受け付けられませんでした" 35 redirect_to root_path 36 end 37 end 38 39 def show 40 @time0900 = Timetable.find() 41 end 42 43 def destroy 44 end 45 46 private 47 def timetable_params 48 params.require(:timetable).permit(:user_id, :user_name, :date, :hour, :minute) 49 end 50end 51

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

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

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

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

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

guest

回答1

0

ベストアンサー

<% @time0900 = "予約済みです" if !(@time0900 == current_user)%>
@time0900はTimetableでcurrent_user は Userですからけして == は成立しません。
<% @time0900 = "予約済みです" if !(@time0900.user_id == current_user.id)%>
としてみてください。

>あと、条件分岐はviewにもかけると思うのですが、こういう分岐はコントローラーに書く方が良いのでしょうか?
私の好みとしては、viewにはできるだけrubyを書かないようにしています。
<% %> だとか <%= %> だとかあって読みにくい。
ですので 私好みに書いて頂くとすると「controllerで書けるならそっちで書いて」です。

viewに書くとしても

<% if @time0900.count == 4 %> <% @time0900.each do |f| %><td><%= f.user_name %></td><% end %>

の連続はつらいです。
ifやcaseがあると、単なる場合分けなのか例外処理なのか緊張感が走りますし、
@time1930 までこれが18組もあるかと思うと、、、、、

<td><%= f.user_name %></td> <% (4-@time0900.count).times do %><td>予約可能です</td><% end %> <% @time0900.count.times do %><tf></td><% end %>

とか。
更に 
@time['0900'] = Timetable.where(hour: "9", minute: "00")
として、viewの方を二重loopで処理したい。

投稿2020/02/16 08:18

winterboum

総合スコア23567

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

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

muraishi

2020/02/16 13:30

ありがとうございます! やっぱりコントローラーに書いた方が良いですよね!でもviewに書く方が簡単そうなのでviewで書いたのですが、コントローラーに書くように頑張ります。view用に書いてくださったリファクタリング?すごいです!とてもスッキリしました。わたしも、「これはもっと手短に書けるんだろうけど...」と思っていたのですが、どう書いて良いのかわかりませんでした。 問題の <% @time0900 = "予約済みです" if !(@time0900.user_id == current_user.id)%> を試しに入れてみたですが、エラーが出てしまいます。 これの原因と打開策をずっと考えていたのですが、よくわかりませんでした。 やはり、コントローラー側に記述した方が良いと思うので、そっちの方向で考えます。 いつもありがとうございます! NoMethodError in StaticPages#home Showing /home/ec2-user/environment/portfolio/app/views/helpers/_time_table.html.erb where line #12 raised: undefined method `user_id' for #<Timetable::ActiveRecord_Relation:0x00007f7a9449a1b8> Extracted source (around line #12): 10 11 12 13 14 15 <tr> <td>9:00~9:30</td> <% @time0900 = ["予約済みです"] if !(@time0900.user_id == current_user.id)%> <% @time0900.each do |f| %><td><%= f.user_name %></td><% end %> <% (4-@time0900.count).times do %><td>予約可能です</td><% end %> </tr> Trace of template inclusion: app/views/static_pages/home.html.erb Rails.root: /home/ec2-user/environment/portfolio Application Trace | Framework Trace | Full Trace app/views/helpers/_time_table.html.erb:12:in `_app_views_helpers__time_table_html_erb___1918112975281294955_70082194706980' app/views/static_pages/home.html.erb:28:in `_app_views_static_pages_home_html_erb___1763037265118203_41238900' Request Parameters: None Toggle session dump Toggle env dump Response Headers: None
winterboum

2020/02/16 14:03

<% @time0900 = "予約済みです" if !(@time0900.user_id == current_user.id)%> ですが <% @time0900 = "予約済みです" if !(@time0900.first.user_id == current_user.id)%> ですね。@time0900が単数形なので騙されました。 変数名の単数形複数形は注意深く区別して命名してください
winterboum

2020/02/16 14:04

あと、 viewに書くほうが楽なものもあります。 それはviewでも良いかと。 頑張らないとCONTROLLERに書けないものは適度に頑張るということで
muraishi

2020/02/16 14:44

あーーー!! 複数だったからどのuser_idかわからなかったんですね! いやーほんと名前って大事ですね。気をつけます! ありがとうございます!
muraishi

2020/02/16 14:45

そこの判断は経験とかなんでしょうね! 精進します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問