1. ホーム
  2. ruby-on-rails

[解決済み] Railsのショートカットでnot nilとnot emptyをチェックする?

2023-05-28 01:02:15

質問

ユーザーのための表示ページがあり、各属性はそのページで、それがnilでなく、空文字列でない場合にのみ表示される必要があります。以下に私のコントローラを示しますが、同じコードの行を書かなければならないのは非常に面倒です。 @user.city != nil && @user.city != "" というコードを書かなければならないのは非常に面倒です。私は独自のメソッドを作成することにあまり慣れていませんが、どうにかしてこのようなことを行うためのショートカットを作成することはできませんか? @city = check_attr(@user.city) ? それとも、この手順を短縮する良い方法があるのでしょうか?

users_controller.rb

def show 
  @city = @user.city != nil && @user.city != ""
  @state = @user.state != nil && @user.state != ""
  @bio = @user.bio != nil && @user.bio != ""
  @contact = @user.contact != nil && @user.contact != ""
  @twitter = @user.twitter != nil && @user.twitter != ""
  @mail = @user.mail != nil && @user.mail != ""
end

どのように解決するのですか?

これをやってくれるメソッドがあります。

def show
  @city = @user.city.present?
end

present? メソッドは nil に加えて、内容があるかどうかを調べます。空文字列、スペースやタブで構成される文字列は存在しないものとみなされます。

このパターンは非常に一般的なので、ActiveRecordにはショートカットさえあります。

def show
  @city = @user.city?
end

これはほぼ同等です。

注意点として、テスト対 nil はほとんど常に冗長です。Ruby では論理的に誤った値は 2 つだけです。 nilfalse . 変数がリテラルであることが可能でなければ false にすることが可能でなければ、これで十分でしょう。

if (variable)
  # ...
end

これは、通常の if (!variable.nil?) または if (variable != nil) のようなものがたまに現れます。Rubyでは、より還元的な表現が好まれる傾向にあります。

比較したい理由のひとつに nil であるトライステート変数がある場合です。 true , false または nil であり、最後の2つの状態を区別する必要があります。