0

5 + Postgresのアプリを使用する前に、すべての結果は、私はこのようなクエリを行うかどうかを確認:。Railsの5 ActiveRecordは - 私のRailsのメソッド

user = User.where("name = ?", name).first.email 

だからこれは私の名前の最初のユーザーの電子メールを与えます

しかし、この名前とは、ユーザーが、私はエラーを取得する存在しない場合:私は、メソッドを使用する前に、任意の結果を持っている場合

NoMethodError (undefined method `email' for nil:NilClass)

はどうすれば確認できますか?

さまざまな方法で使用してこれを実行する場合、私は場合は、句と考えることができます。

user = User.where("name = ?", name).first 

if user 
user_email = user.email 
end 

しかし、これは最もエレガントな方法ではないようですし、私はRailsがより良い方法を持っていると確信しています。

答えて

2

find_byを使用できます。オブジェクトが見つからない場合はnilを返します。

user = User.find_by(name: name) 
if user 
    ... 
end 

あなたが複数の要素を期待している場合は、まだwhere句を使用している可能性が言われていること。

users = User.where(name: name) 
if users.any? 
    user = users.first 
    ... 
end 

は、この例では、あなたがわからない場合は、オブジェクトがnilであるかどうか、あなたが

User.where(name: name).first&.name 

&を使用することができます行うことができますRuby 2.3のようにさらに別の方法がありますユーザーが見つからない場合は、文全体がnilを返します。

+2

あなたのRubyに '&.':' User.where(name:name).firstがない場合は、 'Railsで'試してみることもできます。try(:name) 'を実行します。しかし '試してみてください'から出ないNoMethodErrorsもまた捨てるので、 'try!'が必要なことがあります。 –

1

私はtryを多用しています。

user = User.where("name = ?", name).first.try(:email) 

それは、電子メールを返します、またはコレクションが空の場合(およびfirstがnilである)、それはエラーを出さずにnilを返します。

レコードが見つかったにもかかわらず、メソッドや属性が存在しない場合は、キャッチも失敗しないため、誤字を犯す可能性は低くなりますが、テストではそれをカバーできます。

user = User.where("name = ?", name).first.try(:emial) 

それだけnilオブジェクトで動作するので、あなたはRubyの2.3 &.機能を使用する場合、これはあなたが常にUser.where("name = ?", name).first&.emailを使用することができます...

user = User.where("name = ?", name).first&.emial 
# this will raise an error if the record is found but there's no emial attrib. 
-1

問題ではありませんが、私は

ことを同意しません
user = User.where("name = ?", name).first 

if user 
    user_email = user.email 
end 

は特に魅惑的ではありません。あなたは本当にあなたが一度だけユーザレコードを使用するつもりだと思う場合を除き、あなたが使っているものは何でもロジックと明示されなければならないことを好む

def my_method 
    if user 
    # do something with user.email 
    end 
end 

private 

def user 
    @user ||= User.where("name = ?", name).first 
    # @user ||= User.find_by("name = ?", name) # can also be used here, and it preferred. 
end 

ようなもので、それをクリーンアップすることができます。

関連する問題