【问题标题】:How to implements a button tag to form_for helper?如何为 form_for 助手实现一个按钮标签?
【发布时间】:2011-09-07 01:23:23
【问题描述】:

我需要实现一个创建<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 中没有实现。

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

【问题讨论】:

  • 我认为使用 helper 更聪明。

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


【解决方案1】:

您可以创建一个继承自 FormBuilder 的自定义表单助手,以便在创建表单时使用。我创建了这个按钮方法来使用 Twitter 的 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。 DRY 开发人员

添加以下内容

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 %>

【讨论】:

  • 刚刚有完全相同的用例!很有用:)
  • 一个小错误修复:按钮方法定义应该是 def button(label, options={}),否则 options[:class] 总是 nil
  • 太真实了。刚刚修好了。我不小心忘记了options=args.extract_options!,它也能起到同样的作用,但是哈希看起来非常漂亮。
【解决方案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

然后你以&lt;%= submit_button @admission %&gt;的形式调用它

看起来像这样:

【讨论】:

  • 您的解决方案有效,但我希望像 f.button 这样的实现看起来像其他输入。我可以在帮助程序中复制 Rails 3.1 button_tag 并使用它,但我认为使用 f.button 有助于使代码更清晰。
  • @jrdi 是的,您始终可以覆盖默认实现。只要你记得你已经覆盖并确保它不会破坏其他任何东西并将其传达给团队。或者,采用这条路线并完全实现不同的方法,然后改用它。没有麻烦。
猜你喜欢
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多