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

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

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

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

Ruby on Rails 6

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

Q&A

2回答

445閲覧

RailsでのLintチェック解消方法

higmonta

総合スコア29

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/09/27 15:53

前提

開発環境は、以下のようになります。
Rubu:3.1.2
Rails:6.0.4.1
rubocopでのLintチェックのエラーが解消できない件

実現したいこと

下記のコードのLintチェックが通りません。

if (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time < rest_fish_time && ((count - let_foodstuff_capacity) % let_foodstuff_capacity).zero? ((let_foodstuff_capacity - cookware_capacity) / cookware_capacity).ceil * cooking_time + cooking_total_time + (rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time) * ((count - let_foodstuff_capacity) / let_foodstuff_capacity) elsif (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time < rest_fish_time && (count - let_foodstuff_capacity) % let_foodstuff_capacity != 0 ((let_foodstuff_capacity - cookware_capacity) / cookware_capacity).ceil * cooking_time + cooking_total_time + (rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time) * ((count - let_foodstuff_capacity) / let_foodstuff_capacity) + rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + ((count % let_foodstuff_capacity) / cookware_capacity).ceil * cooking_time

rubocopを実行すると以下のようになります。

..........C.................... Offenses: app/forms/calculate_cooking_time.rb:41:13: C: [Correctable] Layout/MultilineOperationIndentation: Align the operands of an expression spanning multiple lines. ((count - let_foodstuff_capacity) / let_foodstuff_capacity) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ app/forms/calculate_cooking_time.rb:47:13: C: [Correctable] Layout/MultilineOperationIndentation: Align the operands of an expression spanning multiple lines. ((count - let_foodstuff_capacity) / let_foodstuff_capacity) + rest_fish_time - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 31 files inspected, 2 offenses detected, 2 offenses auto-correctable

試したこと

以下を試しました。

if (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time < rest_fish_time && ((count - let_foodstuff_capacity) % let_foodstuff_capacity).zero? ((let_foodstuff_capacity - cookware_capacity) / cookware_capacity).ceil * cooking_time + cooking_total_time + (rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time) * ((count - let_foodstuff_capacity) / let_foodstuff_capacity) elsif (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time < rest_fish_time && (count - let_foodstuff_capacity) % let_foodstuff_capacity != 0 ((let_foodstuff_capacity - cookware_capacity) / cookware_capacity).ceil * cooking_time + cooking_total_time + (rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time) * ((count - let_foodstuff_capacity) / let_foodstuff_capacity) + rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + ((count % let_foodstuff_capacity) / cookware_capacity).ceil * cooking_time
..........C.................... Offenses: app/forms/calculate_cooking_time.rb:39:11: C: [Correctable] Layout/MultilineOperationIndentation: Use 2 (not 0) spaces for indenting an expression spanning multiple lines. cooking_total_time + (rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + ^^^^^^^^^^^^^^^^^^ app/forms/calculate_cooking_time.rb:41:11: C: [Correctable] Layout/MultilineOperationIndentation: Align the operands of an expression spanning multiple lines. ((count - let_foodstuff_capacity) / let_foodstuff_capacity) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ app/forms/calculate_cooking_time.rb:45:11: C: [Correctable] Layout/MultilineOperationIndentation: Use 2 (not 0) spaces for indenting an expression spanning multiple lines. cooking_total_time + (rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + ^^^^^^^^^^^^^^^^^^ app/forms/calculate_cooking_time.rb:47:11: C: [Correctable] Layout/MultilineOperationIndentation: Align the operands of an expression spanning multiple lines. ((count - let_foodstuff_capacity) / let_foodstuff_capacity) + rest_fish_time - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ app/forms/calculate_cooking_time.rb:48:11: C: [Correctable] Layout/MultilineOperationIndentation: Use 2 (not 0) spaces for indenting an expression spanning multiple lines. (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ app/forms/calculate_cooking_time.rb:49:11: C: [Correctable] Layout/MultilineOperationIndentation: Use 2 (not 0) spaces for indenting an expression spanning multiple lines. ((count % let_foodstuff_capacity) / cookware_capacity).ceil * cooking_time ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 31 files inspected, 6 offenses detected, 6 offenses auto-correctable

if (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time < rest_fish_time && ((count - let_foodstuff_capacity) % let_foodstuff_capacity).zero? ((let_foodstuff_capacity - cookware_capacity) / cookware_capacity).ceil * cooking_time + cooking_total_time + (rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time) * ((count - let_foodstuff_capacity) / let_foodstuff_capacity) elsif (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time < rest_fish_time && (count - let_foodstuff_capacity) % let_foodstuff_capacity != 0 ((let_foodstuff_capacity - cookware_capacity) / cookware_capacity).ceil * cooking_time + cooking_total_time + (rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time) * ((count - let_foodstuff_capacity) / let_foodstuff_capacity) + rest_fish_time - (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + ((count % let_foodstuff_capacity) / cookware_capacity).ceil * cooking_time
..........C.................... Offenses: app/forms/calculate_cooking_time.rb:41:11: C: [Correctable] Layout/MultilineOperationIndentation: Align the operands of an expression spanning multiple lines. ((count - let_foodstuff_capacity) / let_foodstuff_capacity) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ app/forms/calculate_cooking_time.rb:47:11: C: [Correctable] Layout/MultilineOperationIndentation: Align the operands of an expression spanning multiple lines. ((count - let_foodstuff_capacity) / let_foodstuff_capacity) + rest_fish_time - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ app/forms/calculate_cooking_time.rb:48:12: C: [Correctable] Layout/MultilineOperationIndentation: Use 2 (not 1) spaces for indenting an expression spanning multiple lines. (let_foodstuff_capacity / cookware_capacity).ceil * cooking_time + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ app/forms/calculate_cooking_time.rb:49:12: C: [Correctable] Layout/MultilineOperationIndentation: Use 2 (not 1) spaces for indenting an expression spanning multiple lines. ((count % let_foodstuff_capacity) / cookware_capacity).ceil * cooking_time ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 31 files inspected, 4 offenses detected, 4 offenses auto-correctable

参考記事

https://youtrack.jetbrains.com/issue/RUBY-25600/Code-style-compatibility-with-Rubocops-LayoutMultilineOperationIndentation

https://techracho.bpsinc.jp/hachi8833/2016_12_16/31386

ご教示お願いします。

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

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

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

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

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

guest

回答2

0

根本的な問題として、1つの式が長すぎる上に、同じ部分式が何度も出現しているようなので、部分式を一時変数に入れて書き直すのがいいのではないでしょうか。

投稿2022/09/27 21:44

maisumakun

総合スコア145183

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

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

0

目がチカチカします。
maisumakunさんのご指摘の他、これが読みにくいのは

if と elseif で条件のどこが異なるのか、条件が何を意味するのか、がわかりにくい
if とelsif の(とおそらく elseも)実行部の違いがどこにあるのか、その式の意図 がわかりにくい
ということがあります。
変数に入れるというのも有りですが、意図のわかる命名された method に抽出して

if 時間に余裕有り && 何やら.zero? elsif 時間に余裕有り && 何やら != 0

とすると場合分けの意図がよくわかるようになります。
実行部も違いは最後が
* ((count - let_foodstuff_capacity) / let_foodstuff_capacity) なのか
+((count % let_foodstuff_capacity) / cookware_capacity).ceil * cooking_time なのか
だけだ、と気がつくまでが一苦労。
これを共通部分に適切な命名をして
基本の値 * ((count - let_foodstuff_capacity) / let_foodstuff_capacity)
基本の値 +((count % let_foodstuff_capacity) / cookware_capacity).ceil * cooking_time
とすると意図がわかりやすくなります。
基本の値 のところは else 部も見て括り方を工夫する必要はあります。

投稿2022/09/28 03:37

winterboum

総合スコア23329

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問