1

これを1行でコーディングする方法はありますか?<%= "A"if.......>のようなもの

<% if @box == 'inbox' && m.is_read?(current_user) %>
A
<% else %>
B
<% end %> 
4

3 に答える 3

5

三項演算子が必要です。Rubyでは「条件付き」演算子とも呼ばれ、前の式?がtrueの場合は「A」を返し、式がfalseの場合は「B」を返します。

<%= (@box == 'inbox' && m.is_read?(current_user)) ? "A" : "B" %>
于 2013-01-27T15:18:34.553 に答える
2

三項演算子がトリックを実行します(使用方法については他の回答を参照してください)が、ここでは使用しないことを強くお勧めします。三元演算子を使用すると、コードを減らすことができますが、そのために読みやすさが大幅に低下します。

于 2013-01-27T15:20:23.853 に答える
0

3 値は、ビュー レイヤーで頭痛の種になるだけです。ロジックはヘルパーにある必要があります。たとえば、

def inbox_msg_read?(box, msg)
  box == 'inbox' && msg.is_read?(current_user)
end

<%= inbox_msg_read?(@box, msg) ? 'A' : 'B' %>

ここで実際に何が起こっているかによって、「A」/「B」の部分もヘルパーに移動する可能性があります。

「受信トレイ」ロジックをヘルパー メソッドまたはメールボックス オブジェクトに移動します。

box.inbox? && msg.is_read?(current_user)

これにより、受信ボックスのロジックが 1 つの場所に分離され (例: 任意の数のビュー ファイルに分散されない)、他のボックス (例: "ゴミ箱" など) に追加のロジックが必要な場合に単一の焦点が作成されます。

また、よく知られているボックス (たとえば、ゴミ箱、送信済み、今日など) がいくつかある場合、ボックスを識別するのに何かメタプログラムが役立つ可能性があるというヒントも提供します。

このようなロジックをビュー レイヤー全体に分散させると、リファクタリングが目立たなくなり、ロジック/出力の変更が必要な場合に複数の変更点が強制されます。

于 2013-01-27T19:38:10.057 に答える