accept a block in button_to helper

Make possible to use a block in button_to helper if button text is hard
to fit into the name parameter, e.g.:

    <%= button_to [:make_happy, @user] do %>
      Make happy <strong><%= @user.name %></strong>
    <% end %>
    # => "<form method="post" action="/users/1/make_happy" class="button_to">
    #      <div>
    #        <button type="submit">
    #          Make happy <strong>Name</strong>
    #        </button>
    #      </div>
    #    </form>"
This commit is contained in:
Sergey Nartimov 2012-05-30 23:15:15 +03:00
parent 1376f4cab1
commit ab7a80ea22
3 changed files with 51 additions and 3 deletions

@ -1,5 +1,21 @@
## Rails 4.0.0 (unreleased) ##
* Make possible to use a block in button_to helper if button text is hard
to fit into the name parameter, e.g.:
<%= button_to [:make_happy, @user] do %>
Make happy <strong><%= @user.name %></strong>
<% end %>
# => "<form method="post" action="/users/1/make_happy" class="button_to">
# <div>
# <button type="submit">
# Make happy <strong>Name</strong>
# </button>
# </div>
# </form>"
*Sergey Nartimov*
* change a way of ordering helpers from several directories. Previously,
when loading helpers from multiple paths, all of the helpers files were
gathered into one array an then they were sorted. Helpers from different

@ -294,6 +294,16 @@ def link_to(*args, &block)
# # <div><input value="New" type="submit" /></div>
# # </form>"
#
# <%= button_to [:make_happy, @user] do %>
# Make happy <strong><%= @user.name %></strong>
# <% end %>
# # => "<form method="post" action="/users/1/make_happy" class="button_to">
# # <div>
# # <button type="submit">
# # Make happy <strong><%= @user.name %></strong>
# # </button>
# # </div>
# # </form>"
#
# <%= button_to "New", :action => "new", :form_class => "new-thing" %>
# # => "<form method="post" action="/controller/new" class="new-thing">
@ -331,7 +341,16 @@ def link_to(*args, &block)
# # </div>
# # </form>"
# #
def button_to(name, options = {}, html_options = {})
def button_to(*args, &block)
if block_given?
options = args[0] || {}
html_options = args[1] || {}
else
name = args[0]
options = args[1] || {}
html_options = args[2] || {}
end
html_options = html_options.stringify_keys
convert_boolean_attributes!(html_options, %w(disabled))
@ -350,9 +369,15 @@ def button_to(name, options = {}, html_options = {})
request_token_tag = form_method == 'post' ? token_tag : ''
html_options = convert_options_to_data_attributes(options, html_options)
html_options.merge!("type" => "submit", "value" => name || url)
html_options['type'] = 'submit'
inner_tags = method_tag.safe_concat tag('input', html_options).safe_concat request_token_tag
button = if block_given?
content_tag('button', html_options, &block)
else
tag('input', html_options.merge('value' => name || url))
end
inner_tags = method_tag.safe_concat(button).safe_concat(request_token_tag)
content_tag('form', content_tag('div', inner_tags), form_options)
end

@ -144,6 +144,13 @@ def test_button_to_with_method_get
)
end
def test_button_to_with_block
assert_dom_equal(
"<form method=\"post\" action=\"http://www.example.com\" class=\"button_to\"><div><button type=\"submit\"><span>Hello</span></button></div></form>",
button_to("http://www.example.com") { content_tag(:span, 'Hello') }
)
end
def test_link_tag_with_straight_url
assert_dom_equal "<a href=\"http://www.example.com\">Hello</a>", link_to("Hello", "http://www.example.com")
end