2013-03-19 2 views
2

Я хотел бы иметь кнопку, которая выглядит как Log in with [FB], wher [FB] - это значок шрифта. (Обратите внимание, что этот значок появляется в конце). Для этой цели, это работает:Custom font-awesome button with content_tag

= form_tag my_path, :method => :post do 
    = button_tag do 
    Log in with 
    %i.icon-facebook 

Я хотел бы СУХОЙ это вверх создать новый вспомогательный метод:

def button_to_with_icon(path, text, button_class, icon) 
    form_tag path, :method => :post do 
     button_tag(:class => button_class) do 
     text 
     content_tag :i, "" , :class => icon.to_sym 
     end 
    end 
    end 

Однако text аргумент не делает в HTML. Как я могу исправить эту проблему?

+0

делает 'text.html_safe' работы? – omnikron

+0

@omnikron: нет, это не – AdamNYC

ответ

5

button_tag блок будет использовать то, что вернулся туда как текст. Здесь вы неявно возвращаете content_tag и бросаете текст.

Вы должны использовать concat внутри content_tag блока:

button_tag do 
    concat text 
    concat content_tag(:i, nil, :class => icon.to_sym) 
end 
+0

Спасибо Себастьян. Это работает. Не возражаете ли вы объяснить, почему это работает, и метод ckruse не работает? Мне кажется, что мы здесь конкатенатные строки? – AdamNYC

+0

@AdamNYC Пожалуйста, отметьте ответ, как принято, если это сработает для вас :) –

+0

Я сделал. Благодарю. Не могли бы вы объяснить магию? :) – AdamNYC

0

В вашем коде возвращаемое значение text просто теряется. Вы должны вернуть конкатенацию обоих, content_tag и text:

def button_to_with_icon(path, text, button_class, icon) 
    form_tag path, :method => :post do 
    button_tag(:class => button_class) do 
     text + content_tag(:i, "" , :class => icon.to_sym) 
    end 
    end 
end 

метод рубин не ERB :-)

+0

Привет, ckruse: Спасибо, что напомнил мне :-). Однако '+' еще не работает для меня, потому что это заставит 'content_tag' стать строкой, как' text'. Есть ли способ избежать этого? – AdamNYC

+0

Посмотрите на ответ @ Sébastien Saunier – ckruse