Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

それぞれ...またはその他

eachが大好きです 、しかし私はそれに問題があります。 空のコレクションがあるとどうなりますか?

[].eachを呼び出す場合 、何も起こらず、[] 返されます。時々、それはあなたが望むものです。 ただし、特にUIを構築する場合は、空のリストを特別な方法で処理する必要があります。 たとえば、データがない場合は通常、別のメッセージを表示したいと思います。

しかし、[].each以降 []を返します 、nilではありません 、あなたはこのようなものを書くのに行き詰まっています:

app / views / users / index.html.erb
<% if @users.empty? -%>
  <p>You don't have any users. <%= link_to "Add one!", new_user_path %></p>
<% else -%>
  <% @users.each do |user| -%>
      <p><%= user.name %></p>
  <% end -%>
<% end -%>

それは機能しますが、ぎこちなく感じます。むしろ、「このコレクションの各アイテムに対して、何も含まれていない場合を除いて、このことを実行してください。その場合は、この他のことを完全に実行してください。」 eachのようなものが欲しい 、「またはその他」を使用します。

レンダリングレールコレクション

ビュー内では、Railsが役立ちます。もののコレクションをレンダリングするのに最適です:

app / views / users / index.html.erb
<%= render @users %>
app / views / users / _user.html.erb
<p><%= user.name %></p>

renderの場合 @usersが渡されます 、_user.html.erbをレンダリングします @users内のユーザーごとに1回 。 eachはスキップできます 完全に。

ボーナスとして、@users 空です、render nilを返します 、私たちが望むように! したがって、これを記述して、元のバージョンと同じ出力を取得できます。

app / views / users / index.html.erb
<%= render(@users) || render('empty') %>
app / views / users / _user.html.erb
<p><%= user.name %></p>
app / views / users / _empty.html.erb
<p>You don't have any users. <%= link_to "Add one!", new_user_path %></p>

Railsの規則を理解すれば、はるかに直接的になります。

ビューの外側はどうですか?

Railsをフォローしている場合は、render コレクションを使用することは、オブジェクトのコレクションをレンダリングするための高速で強力な方法です。

ただし、各アイテムをレンダリングするために余分な部分を処理したくない場合があります。またはrender あなたのデザインをサポートしません。または、ビューの中にいることすらありません。

私がこれまでに見つけた最善の解決策は、presence

list.presence と同じです:

if list.present?
  list
else
  nil
end

つまり、リストに何かが含まれている場合はリストが返され、nil 空の場合。

presenceを使用 、あなたは書くことができます:

@users.each do |user|
  puts user.name
end.presence || puts("You don't have any users.")

@usersにユーザーがいる場合、これはそれぞれの名前を出力します 、またはYou don't have any users それ以外の場合。

それでも、presenceがなくてもできました 。それは1つなので、ハックのように感じます。サポートされている場合は、次のような方が良いかもしれません:

@users.each do |user|
  puts user.name
end || puts("You don't have any users.")

またはSmalltalkっぽい:

@users.each(if_empty: lambda { puts "You don't have any users." }) do |user|
  puts user.name
end

または(ガスプ!):

for user in @users
  puts user.name
else
  puts "You don't have any users."
end

ただし、今のところ、私は通常presenceを使用します または、空白の場合は基本的なif blank?; else each パターン。

どちらが良いと思いますか?空のリストをどのように処理しますか?より良い方法を見つけましたか?もしそうなら、それについて教えてください!


  1. JavaScriptの条件文

    JavaScriptには3種類の条件文があります- ステートメントの場合 − ifステートメントは、特定の条件が満たされた場合にのみ、ifブロック内のコードを実行するために使用されます。 Ifelseステートメント − If….Elseステートメントは、2つの条件のみをチェックし、それぞれに対して異なるコードを実行するために使用されます。 if elseifelseステートメント −if…elseif…elseステートメントは、3つ以上の条件をチェックするために使用されます。 以下は、JavaScriptで条件文を実装するためのコードです- 例 <!DOCTYPE html&

  2. IFコマンド...SQLServerのELSE

    他のプログラミング言語と同様に、SQL ServerもユーザーにIFコマンドELを提供します。この記事では、構文の使用方法と明確な例を詳しく説明し、IFを想像しやすくします。 。その他。 説明 SQL Serverでは、IFステートメント。 ELSEは、条件付き命令を実行するために使用されます。正しいコマンドがコマンドを実行した場合、失敗した場合は別のコマンドを実行します。 IFの使用構文。 ELSE IFブランチステートメントを使用します。 SQL ServerのELSEでは、次の構文を使用します。 IF dieukien {. statement executed when c