Rails帮助迭代器

时间:2011-08-16 16:55:02

标签: ruby-on-rails ruby ruby-on-rails-3 helper

我有以下帮助方法:

def tile_for( photo, tileClass = nil )
    div_for( photo, :class => tileClass ) do
        link_to( image_tag( photo.image_url(:sixth) ), photo )
        content_tag( :div, photo.location(:min), :class => 'caption' )
    end
end

问题是,它返回这种输出:

<div id="photo_25" class="photo">
    <div class="caption" style="display: none;">Berlin</div>
</div>

如您所见,link_to未输出。我想这是因为只包含块的返回值,而不是每条执行的行?我真的不明白为什么这种代码在视图中完美运行,但在辅助方法中根本不起作用。任何人都可以告诉我发生了什么以及为什么它的工作方式有效?你会如何构建这样的循环辅助方法?

3 个答案:

答案 0 :(得分:2)

它在视图中工作,因为ERB实际上只是一个很大的连接引擎。您需要在帮助程序中“手动”执行此操作,因为ERB不会解释代码:

def tile_for( photo, tileClass = nil )
  div_for( photo, :class => tileClass ) do
    link_to(image_tag( photo.image_url(:sixth)), photo)
    + # <- Add this so the block returns the whole string
    content_tag(:div, photo.location(:min), :class => 'caption')
   end
end

div_for也支持数组,这些数组将被收集到一个连续的字符串中。所以你也可以这样做:

  [link_to(image_tag(photo.image_url(:sixth)), photo),
   content_tag(:div, photo.location(:min), :class => 'caption')]

答案 1 :(得分:1)

任何其他答案都可以。现在,解释为什么它在ERB中起作用。

在ERB模板中,当找到&lt;%= 时,它会转换为"#{@insert_cmd}((#{content}).to_s)"。一个简单的例子:<%= "a" %>被翻译为print "a"

您可以查看第631 in erb.rb行,但可以浏览以前的代码,以便动摇上下文(与内容相关)。

答案 2 :(得分:0)

仅返回块的最后一个值。您需要确保您的块返回单个值:

def tile_for( photo, tileClass = nil )
    div_for( photo, :class => tileClass ) do
        link_to( image_tag( photo.image_url(:sixth) ), photo ) + 
        content_tag( :div, photo.location(:min), :class => 'caption' )
    end
end