【问题标题】:Rails - Pass options into a helper method that accepts a block?Rails - 将选项传递给接受块的辅助方法?
【发布时间】:2016-02-09 13:09:07
【问题描述】:

我有一个创建邮件模板行 (html) 的助手。我希望能够将样式传递给行(可选),例如背景颜色。

module MailHelper
  def module_row(&block)
    h << "<table border='0' cellpadding='0' cellspacing='0' width='100%'>"
    # more table html here
    h << capture(&block)
    # more table html here
    h << "</table>"
    raw h
  end
end

我希望能够选择性地传入背景颜色,但在传入“&block”时我似乎无法弄清楚如何做到这一点。这在 Ruby 中可行吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    你当然可以!

    module MailHelper
      def module_row(options={}, &block)
        ...
        if options[:foo]
          do_foo_stuff
        end
      end
    end
    
    <% module_row(foo: true) do |x| %>
      ...
    <% end %>
    

    通常的做法是这样定义默认值:

    def module_row(options={}, &block)
      opts = { 
        foo: true,
        background_color: 'black'
      }.merge!(options)
    
      if opts[:foo]
        do_foo_stuff
      end
    end
    

    【讨论】:

    • 我生活在过去,不知道双板。我还没有玩过关键字参数。
    • 在这里传递 splat 参数是没有意义的:def module_row(options = {}, &amp;block).
    • @mudasobwa 你是对的。我已经离开游戏一年了,并使用 stackoverflow 将其全部恢复。
    【解决方案2】:

    您可以将选项作为哈希很好地传递,例如:

    module MailHelper
      def module_row(**opts, &block)
        bgcolor = opts[:bgcolor] || '#FFFFFF'
        ...
        h << "<table border='0' cellpadding='0' cellspacing='0' width='100%'>"
        # more table html here
        h << capture(&block)
        # more table html here
        h << "</table>"
        raw h
      end
    end
    

    然后你可以调用:

    module_row(bgcolor: '#AAAAAA', &my_block)
    

    或:

    module_row(bgcolor: '#AAAAAA') { block content }
    

    【讨论】:

      猜你喜欢
      • 2012-08-07
      • 1970-01-01
      • 2019-05-05
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多