你能把_tag作为rails helper参数传递吗?

时间:2017-01-22 04:05:42

标签: ruby-on-rails ruby

我想通过帮助程序定义两种表单字段类型(f.text_fieldf.text_area):

def helper_thing(tagtype, field_id)
  tagtype("#{field_id}", class: 'input-group-field')
end

我想在视图中使用tagtype作为表单文本助手的变量(使用haml):

= helper_thing(f.text_field, 'random_id')

我希望输出结果如下:

f.text_field('random_id')

我总是得到一个错误,说“1 ... 3的args 0的无效数量”,这实际上导致我的其余参数失败。为了简洁起见,我在我的例子中只使用了一个参数。

我正在尝试做什么?

2 个答案:

答案 0 :(得分:2)

是的,可能:

def helper_thing(form, tagtype, field_id)
  form.send(tagtype, "#{field_id}", class: 'input-group-field')
end

呼叫:

= helper_thing(f, :text_field, 'random_id')

您尝试的问题是您尝试传入f.text_field,这是text_field方法在f上调用而没有参数。由于所述方法需要1-3个参数,因此最终会出现您所看到的错误。

答案 1 :(得分:0)

除了Michael Kohls的优秀答案之外,还有一种方法可以在不改变方法签名的情况下完成此任务。

由于parens在Ruby中是可选的,因此所有对象都有一个特殊的method方法,如果你想要一个方法的引用,可以使用它 - 不用调用它:

= helper_thing(f.method(:text_field), 'random_id')

然后在传递的Method对象上使用.call

def helper_thing(tagtype, field_id)
  tagtype.call("#{field_id}", class: 'input-group-field')
end