Ruby on rails 在rails视图中,除了<;%=%>;? 简短版本:

Ruby on rails 在rails视图中,除了<;%=%>;? 简短版本:,ruby-on-rails,Ruby On Rails,在我看来,rails的代码很奇怪,比如 <% if @list.empty %><%= val %><% end %> 有没有办法做这样的事 <% if @list.empty some_display_function_i_wish_existed val end %> 长版本: 我有一个模型,tweet.rb,它覆盖了_。to_s工作正常 对于@meme.tweets中的每条tweet,我有一个视图需要输出到_s 我观察到以

在我看来,rails的代码很奇怪,比如

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

有没有办法做这样的事

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

长版本: 我有一个模型,tweet.rb,它覆盖了_。to_s工作正常

对于@meme.tweets中的每条tweet,我有一个视图需要输出到_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 %>

…结果:没有输出

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

…结果:输出是对每个tweet的完整检查,而不是

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

…结果:输出是对每个tweet的完整检查,而不是

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

…结果:按预期工作(为每条tweet输出to_s的结果)。因此:

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

…结果:按预期工作

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

我知道我可以像上一个例子那样做

但是有人能解释一下为什么其他的例子都没有我想要的效果吗

在我看来,规则似乎是:

1) 将获取该对象,调用其上的_,如果未被覆盖,将默认为检查

2) 将执行某些操作

是否有方法使用2)将输出发送到视图

或者使用跨越多行ruby代码的标记是违反规则的吗?

当您不想让正在执行的ruby代码输出任何内容时使用。
标记用于输出内容。这就是为什么您的示例使用
tweet.to\u s
可以正常工作的原因

如果未指定要输出的属性,则是,
put
将显示整个对象。例如,如果在
tweet
对象上有
message
属性,则编写
tweet。message
(当然,在
内部)将只输出该tweet的message属性。

用于不希望正在执行的Ruby代码输出任何内容。
标记用于输出内容。这就是为什么您的示例使用
tweet.to\u s
可以正常工作的原因

如果未指定要输出的属性,则是,
put
将显示整个对象。例如,如果您的
tweet
对象上有
message
属性,则写入
tweet。message
(当然,在
中)将只输出该tweet的message属性。

将打印到输出中,输出内部代码的结果<代码>不会打印任何内容,它只计算内部代码。 这就是第一个例子不起作用的原因。在第二个示例中,您希望
put
打印推文,但是
put
不会打印在同一个缓冲区上。。。(您将看到打印在rails控制台上的tweets)

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

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

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


将内部代码的结果打印到输出<代码>
不会打印任何内容,它只计算内部代码。 这就是第一个例子不起作用的原因。在第二个示例中,您希望
put
打印推文,但是
put
不会打印在同一个缓冲区上。。。(您将看到打印在rails控制台上的tweets)

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

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

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



您的第二个到最后一个示例是正确的方法。使用
=
变量进行输出,缺少equals的变量用于控制结构和非输出代码。如果需要,可以跨越多行,但非输出标记不应该/不会输出任何内容。与php不同,在php中,模板中的
echo
ing是标准做法,它与ruby和
put
不同。此外,倒数第二个示例除了正确之外,还可以轻松地将渲染提取到部分或辅助对象。这反过来使使用automagic“呈现此集合”或“呈现此实例”部分内容更为容易。
可能会包装一个可以跨多行的表达式。请注意,表达式可能由多个子表达式组成。在
的情况下,将封装表达式的返回值添加到视图中。例如,
将在视图输出中显示“3”。您的第二个到最后一个示例是正确的方法。使用
=
变量进行输出,缺少equals的变量用于控制结构和非输出代码。你可以跨越mul