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

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

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

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

Ruby on Rails

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

Q&A

解決済

3回答

649閲覧

ruby: each文を全て回してからunlessで一致していないかを判定する処理を実現したい。

nanase21

総合スコア144

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/07/17 14:24

###前提
roomsの中に入っているclient_id下記の配列とします。
room: [1,3,2,6,4]
params[:id]: 2

ruby

1 def show_room_check 2 rooms = Room.where(customer_id: current_user.id) 3 rooms.each do |room| 4 unless room.client_id == params[:id].to_i 5 return redirect_to users_path 6 end 7 end 8 end 9

実現したいこと

showページに入る前にbefore_actionでそのページに入ってもいいユーザーかどうかをチェックする処理になります。
やりたいこととしては、もしroomのclient_idparams[:id]と等しくなっかたらindex_pathに返すようにしたいです。

困っていること

現状の実装では、一つ目の要素がもし違うとindex_pathに変えられてしまうので、最後までeachを回して一致しなかった場合のみindex_pathに返すようにしたい。

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

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

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

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

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

guest

回答3

0

rb

1redirect_to users_path unless Room.find_by(client_id: params[:id], customer_id: current_user.id)

投稿2019/07/17 14:40

asm

総合スコア15147

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

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

nanase21

2019/07/17 15:15

ご教示いただきありがとうござます。 まさか一行で、私が意図する処理ができるとは思いませんでした。 今回は、他の方をベストアンサーとしましたが本当にありがとうございました。
guest

0

ベストアンサー

全部違ってて遷移であれば.none?という非常に便利な機能があるんですが、最後まで取り敢えず回したい場合は、フラグを使うのはどうでしょうか

ruby

1Flag = 0 2rooms.each do |room| 3 unless room.client_id == params[:id].to_i 4 Flag = 1 5 end 6end 7if Flag==1 then 8 return redirect_to users_path 9end

投稿2019/07/17 14:36

bamboo-nova

総合スコア1408

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

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

nanase21

2019/07/17 14:54 編集

ご教示いただきありがとうございます。 none?メソッドなんてあるんですね。 勉強になりました。 ちなみに、.none?を使った場合、redirirect_to はどこに書けばいいのでしょうか?
nanase21

2019/07/17 14:59 編集

rooms.none? {|w| w.client_id == params[:id].to_i } と書いたのですが、trueの場合にredirect_toをどこに書けば良いのかわからないです。
nanase21

2019/07/17 15:16

ご教示いただきありがとうございます。 上記のURLを参考に出来ました。
bamboo-nova

2019/07/17 15:18

よかったです。多分、今回の実装だけならasmさんのが最適ですね...僕も高評価させて頂きました笑
nanase21

2019/07/17 22:30

確かに今回の実装に限っては、asmさんの回答が1番の最適解なような気がします笑 find_byは一件しかデータを取得できないので、普段あまり使うことがなかったのですがこういう時に使えるんだなと勉強になりました。
guest

0

ruby

1 def show_room_check 2 id = [] 3 rooms = Room.where(customer_id: current_user.id) 4 rooms.each do |room| 5 if room.client_id == params[:id].to_i 6 id = room.client_id 7 end 8 end 9 redirect_to users_path unless id.present? 10 end

コード自体は汚いですが、一応このような形で意図する処理になりました。
もし問題点や気になる点があればご教示いただけると幸いです。

投稿2019/07/17 14:42

nanase21

総合スコア144

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問