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

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

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

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

Ruby on Rails 6

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

Ruby on Rails

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

Q&A

解決済

2回答

940閲覧

Rubyのコード説明とRuboCopのエラーについて

no1knows

総合スコア3365

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/08/06 12:43

お世話になります。
[Rails 4.x] Viewでアクションごとの条件分岐を綺麗に書く小技に記載されていたコードがどのように展開されているのかがよくわかりませんでした。
何が起こっているのか順を追って説明いただけないでしょうか?

before_action :request_path def request_path @path = controller_path + '#' + action_name def @path.is(*str) str.map{|s| self.include?(s)}.include?(true) ← ここで何が起こっているのかがわからない end end

上記アクションを使うと下記のように展開できるようです。

<% if @path.is('pages#index') %> ↓ <% if controller.controller_name == 'pages' && controller.action_name == 'index' %>

またこのコードをRails6でそのまま使おうとすると、RuboCopのエラーが出てしまいます。
こちらの回避方法もあわせて教えていただけると助かります。
イメージ説明

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

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

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

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

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

guest

回答2

0

またこのコードをRails6でそのまま使おうとすると、RuboCopのエラーが出てしまいます。

こちらの回避方法もあわせて教えていただけると助かります。

当該のコードが使いやすいと思っているのでなければ、普通に判定するのが正解です。クラスやモジュール、特殊なDSLで使うのであればともかく、一般のオブジェクトに特異メソッドを立てるようなコードを使うものではありません。

投稿2020/08/07 00:15

maisumakun

総合スコア146018

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

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

no1knows

2020/08/07 12:13

redirect_to edit_company_path if controller_name == 'companies' && action_name == 'new' だとif以下が長くてもう少し短くできないかと思って調べ始めたのですが、上記で問題ないのですね。 ありがとうございます!
guest

0

ベストアンサー

個人的には可読性も悪いし、良い方法とは思わないかなぁ。
とりあえず、何が起きているか考えるには、分解すれば良いのではないでしょうか?

ruby

1def request_path 2 @path = controller_path + '#' + action_name 3 4 # strは文字列または文字列の配列を想定している 5 def @path.is(*str) 6 #str.map{|s| self.include?(s)}.include?(true) 7 8 # ここでのselfは@path="コントローラ#アクション"の文字列を指します 9 10 # str="pages#index"の場合、[true] or [false] 11 # str=["pages#index", "pages#new"]など配列の場合は、[true, false]など 12  # 一致していればtrue, 一致してないならfalse 13  match_list = str.map{|s| self.include?(s) } 14 15 # どれか1つでもtrueならtrueを返すという事   16  match_list.include?(true) 17 end 18end

投稿2020/08/06 14:12

mingos

総合スコア4207

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

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

no1knows

2020/08/07 12:15

分解することをすっかり忘れていました。 自分で動かしてみると、当たり前のことをやっていました。 アドバイスいただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問