我有一个视图,我试图检查表中的字段是否存在,如果是,则只打印该字段。如果没有,它应该打印文本:“(无)”。在我看来,我有:
<%= list_fields(feed) %>
在我的帮助文件中,我有:
def list_fields(feed)
feed.xml_fields.each do |field|
if field.tags?
field.tags
else
puts "(none)"
end
end
end
现在,如果每个字段对象都有标记,则会显示整个表格行;如果没有标记,则显示“[]”。我只想要显示单个标签条目或“(无)”。我的帮手中缺少什么?
答案 0 :(得分:2)
你有两个问题。第一个是你的助手没有返回 <%= ... %>
构造可能包含在视图中的值。
.each
调用返回调用它的对象,在这种情况下它将是feed.xml_fields
,并且它不会返回块计算的各个值。
第二个问题是Rails中的 puts
不会将文本放在渲染视图中 - 它不是PHP。
我不太确定你期望的确切输出,但是如果你想要返回第一个带有'tags'的'field',那么你可以这样做:
def list_fields(feed)
f = feed.xml_fields.detect {|field| field.tags? }
f ? f.tags : "(none)"
end
如果要列出所有标签,并返回字符串“(none)”,如果没有标签,则使用以下内容:
def list_fields(feed)
f = feed.xml_fields.select {|field| field.tags? }.map {|field| field.tags }
f.empty? ? "(none)" : f.join(", ")
end
如果您想使用某些HTML标记加入字段,例如<br/>
,请使用此标记:
def list_fields(feed)
f = feed.xml_fields.select {|field| field.tags? }.map {|field| h(field.tags) }
f.empty? ? "(none)" : f.join("<br/>").html_safe
end
请注意,有两个更改:tags
函数转义了各个h
值,然后将已连接的字符串标记为已经清理。在这种情况下,视图不会再次转义字符串。
如果您真的想在视图或帮助中使用puts
之类的内容,那么您可以阅读方法concat。
答案 1 :(得分:1)
你应该以这样的方式改变你的功能:
def list_fields(feed)
feed.xml_fields.each do |field|
if field.tags?
return field.tags
else
return "(none)"
end
end
end
有两处变化:
each
- 循环的结果就是数组本身,所以最后它会在你的版本中返回。我不明白你为什么要做这个循环。
答案 2 :(得分:0)
从助手返回字符串,而不是使用puts
。我不知道field.tags
是什么格式,但我的猜测是它是一个数组。将字符串格式化为您想要的格式,然后从帮助程序返回它。
类似的东西:
def list_fields(feed)
feed.xml_fields.each do |field|
if field.tags?
"some string"
else
"(none)"
end
end
end