Rails - 将选项传递给接受块的辅助方法?

时间:2016-02-09 13:09:08

标签: ruby-on-rails ruby

我有一个帮助程序,可以创建邮件程序模板行(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

我希望能够选择性地传递背景颜色,但我似乎无法在传递&#39;&amp; block&#39;时弄清楚如何做到这一点。这在Ruby中是否可行?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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 }