在rails视图中,除了<%=%>?之外,如何将输出发送到视图?

时间:2014-01-03 16:25:28

标签: ruby-on-rails

短版:

对我来说,使用rails代码似乎很奇怪,比方说,

<% if @list.empty
  %><%= val %><%
end %>

有没有办法做这样的事情?

<% if @list.empty
  some_display_function_i_wish_existed val
end %>

长版:

我有一个模型,tweet.rb,它会覆盖to_s。 to_s工作正常。

我有一个视图需要为@meme.tweets中的每条推文输出to_s。

我观察到以下情况:

<% @meme.tweets.each do |tweet|
   tweet 
end %>

结果:没有输出

<% @meme.tweets.each do |tweet|
  puts tweet # or tweet.to_s does the same thing
end %>  

...结果:没有输出

<%= @meme.tweets.each do |tweet|
   tweet 
end %>

...结果:输出是每条推文的全部检查,而不是to_s

<%= @meme.tweets.each do |tweet|
  puts tweet # or tweet.to_s does the same thing
end %>  

...结果:输出是每条推文的全部检查,而不是to_s

<% @meme.tweets.each do |tweet| %>
   <%= tweet %>
<% end %>

...结果:按预期工作(为每条推文输出to_s的结果)。所以:

<%= @meme.tweets.collect do |tweet|
   tweet.to_s
end %>

...结果:按预期工作。

我来自PHP背景,并不真正理解这里的规则。

我知道我可以按照我在上一个例子中所做的那样去做。

但有人可以解释为什么其他例子都没有按照我的意图运作吗?

在我看来,规则显示为:

1)&lt;%= something%&gt;将接受那个东西,在它上面调用to_s,如果没有覆盖它将默认检查。

2)&lt;%something%&gt;将执行一些事情

有没有办法使用2)&lt; %%&gt;将输出发送到视图?

或者是否违反了规则&lt; %%&gt;那些跨越多行红宝石代码的标签?

2 个答案:

答案 0 :(得分:2)

希望您正在执行的Ruby代码输出任何内容时,会使用

<% %>。当您想要输出某些内容时,会使用<%= %>标记。这就是使用<%= %>tweet.to_s的示例按预期工作的原因。

如果您没有指定要输出的属性,那么是,puts将显示整个对象。例如,如果您的message对象上有tweet属性,那么编写tweet.message(当然在<%= %>内)将只输出该推文的消息属性

答案 1 :(得分:2)

<%= code %>将输出内部代码的结果。 <% %>不会打印任何内容,它只是评估内部代码。 这就是为什么第一个例子不起作用的原因。在第二个示例中,您希望puts打印推文,但puts不会在同一个缓冲区上打印...(您将看到在推荐控制台上打印的推文)。 / p>

在第3和第4个示例中,您将集合打印为对象(@meme.tweets.each返回Enumerable和ERb调用#to_s)而不是块内的代码。

第五种形式是正确的。这就是你通常会做的事情。 第六种形式在某种程度上也是正确的。你正在迭代一个集合,在每个元素上调用#to_s,然后collect在一个新的数组上,它被打印到输出(但是你打印的是一个字符串数组,而不仅仅是一个字符串字符串)。

您可以使用#join获得类似的结果。 (它返回通过将数组的每个元素转换为字符串而创建的字符串)

<%= @meme.tweets.join %>