开发者

'spaceless' equivalent of Django templates in Rails

Notice the readability and balance of:

<li class='aclass anotherclass <%= maybeaconditionalclass %>'>
   <a href="<%= some stuff %>">
     <%= some other stuff %>
   </a>
</li>

which unfortunately produces trailing whitespace inside the link resulting in a ugly trailing underline. Now although less readable I can live with this:

<li class='apossibleclass anotherclass <%= maybeaconditionalclass %>'>
   <a href="<%= some stuff %>"><%= some other stuff %></a>
</li>

Still, the same problem remains if I now consider this kind of thing:

li.apossibleclass:after {
    content: "/";
}

as the whitespace between the closing A开发者_如何学编程 and LI gets in the way of what should be sticking to my list item's end. I could only produce that ugly mess as a workaround:

<li class='apossibleclass anotherclass <%= maybeaconditionalclass %>'>
   <a href="<%= some stuff %>"><%= some other stuff %></a></li>

Django came up with a nice solution: {% spaceless %}, so I'm looking for the equivalent of the {% spaceless %} tag in Rails erb templates.


Yes, that would be an useful feature, and as far as I know, there's nothing like it in Rails. So I've coded it.

# Strip all whitespace between the HTML tags in the passed block, and
# on its start and end.
def spaceless(&block)
  contents = capture(&block)

  # Note that string returned by +capture+ is implicitly HTML-safe,
  # and this mangling does not introduce unsafe changes, so I'm just
  # resetting the flag.
  contents.strip.gsub(/>\s+</, '><').html_safe
end

This is a helper you can place in your application_helper.rb, and then use like this:

<%= spaceless do %>
  <p>
      <a href="foo/"> Foo </a>
  </p>
<% end %>

... which will result in the output string like

<p><a href="foo/"> Foo </a></p>

Sadly, this only works in Rails 3. Rails 2 support for a feature like this will require some dirty hacks to ERb.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜