如何将逻辑放入Rails助手?

时间:2011-09-13 22:07:47

标签: ruby-on-rails

我有一个视图,我试图检查表中的字段是否存在,如果是,则只打印该字段。如果没有,它应该打印文本:“(无)”。在我看来,我有:

<%=  list_fields(feed) %>

在我的帮助文件中,我有:

    def list_fields(feed)
        feed.xml_fields.each do |field|
            if field.tags?
                field.tags
            else
                puts "(none)"
            end
        end
    end

现在,如果每个字段对象都有标记,则会显示整个表格行;如果没有标记,则显示“[]”。我只想要显示单个标签条目或“(无)”。我的帮手中缺少什么?

3 个答案:

答案 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