【问题标题】:Rails Helpers with iterators带有迭代器的 Rails 助手
【发布时间】:2011-08-16 16:55:01
【问题描述】:

我有以下辅助方法:

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 没有被输出。我猜这是因为只包含块的返回值,而不是每个执行的行?我真的不明白为什么这种代码在视图中可以完美运行,但在辅助方法中却完全不同。谁能告诉我发生了什么以及为什么它会以这种方式工作?您将如何构建这样的循环辅助方法?

【问题讨论】:

  • 试试content_tag(:a, :href =&gt; your_url) do image_tag(photo.image_url(:sixth)) end 我不知道为什么,但我有帮手这样做,由于某种原因,link_to 也不起作用。

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


【解决方案1】:

它在视图中工作,因为 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')]

【讨论】:

  • "ERB 只是一个大的串联引擎。"我从来没有想过这一点,但它非常有道理,并且实际上阐明了我对 Web 应用程序的很多看法。谢谢:)
【解决方案2】:

任何其他答案都可以。现在,解释一下为什么它在 ERB 中有效。

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

您可以查看631 in erb.rb 行,但略过前面的代码以了解上下文(与内容相关)。

【讨论】:

    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      相关资源
      最近更新 更多