🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Q&A

解決済

1回答

388閲覧

redirect_toをもつコントローラメソッドに関するリファクタリングのベストプラクティス

tomoharu

総合スコア107

Ruby on Rails 5

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

0グッド

0クリップ

投稿2019/12/15 06:29

題名長くてすみません。
要は、下記のような汚いコードを想定し、これを直すときのベストプラクティスをご存知の方がいれば教えていただきたいです。

class examplesController def methodEx(params) if params == A #処理1行 #処理1行    redirect_to A_path elsif params == B #処理1行    #処理1行    redirect_to B_path elsif params == c #処理1行    #処理1行 redirect_to C_path end end end

というようなものです。メソッドで飛んできたパラメーターの値によってredirect先が変わります。
前提として、
1.paramsの種類が今後増えることはないです。
2.methodExはこのcontrollerのみでしか使用されません。
自分がこのコードの課題として感じているのは、途中の#処理1行の部分もあるようにゴリゴリのロジックをcontrollerに書いていることです。これを直したいです。

リファクタリング案.1 処理1行の部分を全てモデルに移す
これは自分が一番最初に思いついたやつで実際に行いました。しかしそれでも、

class examplesController def methodEx(params) if params == A #処理1行    redirect_to A_path elsif params == B    #処理1行    redirect_to B_path elsif params == c    #処理1行 redirect_to C_path end end end

このような感じになり、そこまで劇的によくなったかと言われると。。。という感じです。あまり行数も減ってない印象です。

リファクタリング案.2 モジュール化して場所を移す。
このmethodExをconcernsとかに移すこともできるかなと思いました。そうすればexamplesControllerも薄くなります。しかし、methodExが他のcontrollerで使われない特化したメソッドでであるとすると、あまりモジュールに移すのも意味がないように思えます。

この二つぐらいしか有用なもの(実際に有用かは不明)が思い浮かばず、もしより良い方法をご存知の方がいらっしゃいましたら、お教えいただきたいです。正直modelでredirect_toが動かせない以上、if分で切り分けて、それに応じて。。。という処理をcontrollerに書くのはしょうがないのではないかと思っています。ただfatなcontlloerにはなるなあとも思います。何卒よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、同じ変数で処理が分岐しているようですので case 文を適用することを考え付きました。

ruby

1 def methodEx(params) 2 case params 3 when A 4 #処理1行 5   redirect_to A_path 6 when B 7   #処理1行 8   redirect_to B_path 9 when c 10   #処理1行 11 redirect_to C_path 12 end 13 end

次に、path を変数に入れる形にすることで、redirect_to の記載を一回にとどめます

ruby

1 def methodEx(params) 2 # この記法をやったことがないので、このままだと動かないかも 3 destination_path = case params 4 when A 5 #処理1行 6   A_path 7 when B 8   #処理1行 9   B_path 10 when c 11   #処理1行 12 C_path 13 end 14 redirect_to destination_path 15 end

こうすると、redirect_to の行以外全てを、 model メソッドまたはcontrollerの privateメソッドへと移行可能です

※modelメソッドへ移行する場合の記載例になります

ruby

1 def methodEx(params) 2 destination_path = モデル名.hoge_method(params) 3 redirect_to destination_path 4 end 5 6 # model 又は controller の praivate 以下 7 def self.hoge_method(params) 8 case params 9 when A 10 #処理1行 11   A_path 12 when B 13   #処理1行 14   B_path 15 when c 16   #処理1行 17 C_path 18 end 19 end

3段階に分けてみましたが、たとえば3段階目だけど case文 ではなく if 文を使うというようなのもありだと思います。

投稿2019/12/15 06:52

編集2019/12/15 07:07
siruku6

総合スコア1382

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

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

tomoharu

2019/12/15 07:48

確かにとてもスマートですね!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問