如何为form_for帮助器实现一个按钮标签?

时间:2011-06-02 12:33:01

标签: ruby-on-rails ruby-on-rails-3 forms helper

我需要实现一个创建<button>...</button>标记的帮助器,我需要做一些类似的事情:

<%= form_for(some_var) do |f| %>
  <%= f.submit '+' %>
<% end %>

助手应该像这样工作:

<%= f.button '+' %>
# Returns
<button type="submit">+</button>

我看到了https://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/form_tag_helper.rb#L458,但这在Rails 3.0.7中没有实现。

在我的应用程序中实现此帮助程序需要做些什么?

2 个答案:

答案 0 :(得分:8)

您可以创建一个自定义表单助手,该表单助手从FormBuilder继承以在创建表单时使用。我创建了这个按钮方法,用于Twitter的Bootstrap。

用任何适合的方式替换'Bootstrap'。 (也许是CuteAsAButtonBuilder?)

app/helpers/bootstrap_form_builder.rb

class BootstrapFormBuilder < ActionView::Helpers::FormBuilder
    def button(label, options={})

    # You can also set default options, like a class
    default_class = options[:class] || 'btn'
    @template.button_tag(label.to_s.humanize, :class => default_class)    
  end

end

现在您有两种方法可以使用构建器。

1。干鸭子

每次构建使用该按钮的表单时,都需要指定构建器...

<%= form_for @duck, :builder => BootstrapFormBuilder do |form|%>

2。干的开发者

添加以下

app/helpers/application_helper.rb

module ApplicationHelper
  def bootstrap_form_for(name, *args, &block)
    options = args.extract_options!
    form_for(name, *(args << options.merge(:builder => BootstrapFormBuilder)), &block)
  end
end

请打电话给魔术师......

<%= bootstrap_form_for @person do |form| %>
  <%= form.button 'Click Me' %>
<% end %>

答案 1 :(得分:2)

我之前在我的一个应用程序中实现了类似的辅助方法。我需要按钮标签,按钮上有一个图像和一个自己的类。您可以传递一个字符串,该字符串是按钮上显示的文本或对象本身。它看起来像这样:

def submit_button(object)
    image   = "#{image_tag('/images/icons/tick.png', :alt => '')}"

    if object.is_a?(String)
      value = "#{image}#{object}"
    else
      name  = object.class.to_s.titlecase
      value = object.new_record? ? "#{image} Save #{name} Information" : "#{image} Update #{name} Information"
    end

    content_tag :button, :type => :submit, :class => 'button positive' do
      content_tag(:image, '/images/icons/tick.png', :alt => '')
      value
    end
  end

然后您以<%= submit_button @admission %>

的形式调用此内容

看起来像这样:

enter image description here