对我来说,使用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;那些跨越多行红宝石代码的标签?
答案 0 :(得分:2)
<% %>
。当您想要输出某些内容时,会使用<%= %>
标记。这就是使用<%= %>
和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 %>