2017-01-22 16 views
2

私はヘルパーによって定義する2つのフォームフィールドの種類(f.text_fieldまたはf.text_area)を持っている:_tagをrailsヘルパー引数として渡すことはできますか?

def helper_thing(tagtype, field_id) 
    tagtype("#{field_id}", class: 'input-group-field') 
end 
私はビューでフォームのテキストヘルパー(HAMLを使用)のいずれかのための変数として tagtypeを使用したい

:私は常に取得

f.text_field('random_id') 

= helper_thing(f.text_field, 'random_id') 

私は出力が何かのようになります願っています基本的に残りの引数が失敗する原因となります。簡潔さのために私は私の例では1つの議論しか使用しませんでした。

私がしようとしていることは可能ですか?

答えて

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') 

あなたの試みの問題点は、なしftext_fieldメソッドの呼び出しである、f.text_fieldに合格しようとしたということでした議論上記の方法は1-3引数を期待しているので、あなたが見たエラーで終わる。

0

マイケル・コールズの優れた答えに加えて、メソッドのシグネチャを変更せずにこれを行う方法が1つあります。

括弧は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 
+0

ただし、ヘルパーを使用する代わりにカスタムフォームビルダーを作成することもできます。 'f'オブジェクトに複数の参照を渡すのではなく、メソッドを追加することができます。 http://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html – max

関連する問題