【问题标题】:rails/ruby, passing multiple blocks as argumentsrails/ruby,将多个块作为参数传递
【发布时间】:2016-02-27 09:28:01
【问题描述】:

我有一个 rails 辅助方法,我想传递两个不同的块,以便在方法的两个不同位置生成。

在我看来,这就是我想要实现的目标..

    <%= collapsible_content do %>
      <%= page_heading venue.title %>
      <%- venues_facility_opening_times venue %>
    <%-end %>

这就是方法本身

  def collapsible_content(&block1, &block2)
    content_tag(:div, nil, class: 'collapsible-content', data: { name: 'collapsible-1' }) do
      content_tag(:div, nil, class: 'collapsible-content-item') do
        concat button_tag(yield &block1, class: 'collapsible-content-toggle')
        concat hidden_content(&block2)
      end
    end
  end

  private

  def hidden_content(&block)
    content_tag(:div, class: "collapsible-content-body") do
      content_tag(:div, yield) if block_given?
    end
  end

但是,据我了解,&amp;block 始终是最后一个参数,那么如何区分它们的产生位置?

我尝试使用 lambda,但 ActiveSupport::SafeBuffer 阻止了这一点。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    也许这个(使用了 2 个 Proc)?

    定义:

    def collapsible_content(proc1, proc2)
      content_tag(:div, some_options) do
        content_tag(:div, some_other_options) do
          concat button_tag(proc1.call)
          concat hidden_content(proc2.call)
        end
      end
    end
    
    def hidden_content(proc)
      content_tag(:div, class: "collapsible-content-body") do
        content_tag(:div, proc.call)
      end
    end
    

    用法:

    <%= collapsible_content(Proc.new{ page_heading(venue.title) }, Proc.new{ venues_facility_opening_times(venue) }) %>
    

    感谢这个帖子:Passing multiple code blocks as arguments in Ruby

    【讨论】:

    • 好答案。也许不能传递带有两个块的序言,但两个 proc(或一个块和一个 proc)可以,具有相同的期望结果。
    猜你喜欢
    • 2011-01-28
    • 2017-11-20
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2014-01-06
    • 2010-10-24
    相关资源
    最近更新 更多