5

コントローラーで定義された単純な配列を、要素ごとに改行してビューに出力しようとしています。しかし、それがしているのは、配列全体を 1 行に出力することです。

これが私のコントローラーです:

class TodosController < ApplicationController
  def index
    @todo_array = [ "Buy Milk", "Buy Soap", "Pay bill", "Draw Money" ]
  end
end

これが私の見解です:

<%= @todo_array.each do |t| %>
<%= puts t %><\br>
<% end %>

結果は次のとおりです。

<\br> <\br> <\br> <\br> ["Buy Milk", "Buy Soap", "Pay bill", "Draw Money"]
4

5 に答える 5

14

ビューで使用しているテンプレートエンジンであるErbには、テンプレート内にルビーコードを埋め込むためのいくつかの異なる方法があります。

ブロック内にコードを配置<%= %>すると、erbは内部のコードを評価し、HTMLの最後のステートメントの値を出力します。.eachin ruby​​は繰り返し処理したコレクションを返すため、を使用したループは<%= %>配列全体の文字列表現を出力しようとします。

ブロック内にコードを配置<% %>すると、erbはコードを評価するだけで、何も出力しません。これにより、ビュー内の条件ステートメント、ループ、または変数の変更を行うことができます。

putsからを削除することもできますputs t。Erbは、内部で最後に見た値を表示用の文字列に変換しようとすることを知ってい<%= %>ます。

于 2012-11-04T14:56:38.260 に答える
6

なぜ最初の行に「=」記号を入れているのですか。<% %> は、この下の文字列が ruby​​ コードであることを Rails に伝え、評価するために使用されます。<%= %> として、これらのタグの文字列がルビであることをレールに伝え、それを評価し、結果を html ファイルにも出力します。

したがって、書いているコードを調べてみてください

<%=@todo_array.each do |t| %> この行は @todo_array を反復するためだけのものですが、その行を出力する必要はありません。したがって、最終的なコードは

<% @todo_array.each do |t| %>
 <%= puts t %>
<% end %>
于 2012-11-04T14:55:42.883 に答える
6

ちょうど試して:

<%= @todo_array.join('<br />').html_safe %>

それ以外の

<%= @todo_array.each do |t| %>
   <%= puts t %><\br>
<% end %>
于 2014-03-18T16:28:22.133 に答える
5

あなたの見解に関する2つの問題:

  1. 「<%」を使用すべきところに「<%=」を使用しています。
  2. 「プット」は必要ありません

これにより、結果が改善されるはずです。

<% @todo_array.each do |t| %>
  <%= t %><\br>
<% end %>

さらに、(行末に br タグを使用する代わりに) HTML 構造を使用して todo リストをより適切に構成することを検討します。おそらく、次のような順序付けられていないリストです。

<ul>
  <% @todo_array.each do |t| %>
    <li><%= t %></li>
  <% end %>
</ul>
于 2012-11-04T14:49:19.680 に答える
2

各ステートメントから等号を削除します。

<% @todo_array.each do |t| %>
  <%= t %><\br>
<% end %>
于 2012-11-04T14:42:51.487 に答える