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

dec*_*cay 3 forms ruby-on-rails helper ruby-on-rails-3

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

<%= form_for(some_var) do |f| %>
  <%= f.submit '+' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

帮助器应该像这样工作:

<%= f.button '+' %>
# Returns
<button type="submit">+</button>
Run Code Online (Sandbox Code Playgroud)

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

我需要做什么才能在我的应用程序中实现这个帮助器?

fny*_*fny 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
Run Code Online (Sandbox Code Playgroud)

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

1.为鸭子干

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

<%= form_for @duck, :builder => BootstrapFormBuilder do |form|%>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

只需打电话给魔术师......

<%= bootstrap_form_for @person do |form| %>
  <%= form.button 'Click Me' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)