DRY, Short и обычный помощник, который возвращает несколько строк HTML - PullRequest
0 голосов
/ 22 января 2012

Я ищу СУЩЕСТВЕННЫЙ, самый обычный и самый короткий способ написания этого помощника.

У меня есть что-то вроде этого в верхней части каждого файла представления индекса:

<%= page_header "Blog", "My thoughts on things" %>

И соответствующий помощник:

def page_header(title=nil, subtitle=nil)
  header = ''
  header += content_tag(:h1, title) if title.present?
  header += content_tag(:h3, subtitle) if subtitle.present?
  return header.html_safe
end

Это работает, но это уродливо, и я знаю, что есть лучший способ, я просто не могу его найти.

Ответы [ 2 ]

1 голос
/ 22 января 2012

Я бы пошел на частичку.

app/views/shared/_page_header.html.erb * * 1004

<% if title.present? %>
  <h1><%= title %></h1>
<% end %>

<% if subtitle.present? %>
  <h3><%= subtitle %></h3>
<% end %>

И помощник будет:

def page_header(title = nil, subtitle = nil)
  render "shared/page_header", :title => title, :subtitle => subtitle
end

Вы также можете посмотреть на клеток .

1 голос
/ 22 января 2012

Я бы попробовал что-то вроде:

def page_header(title=nil, subtitle=nil)
  [
    title && content_tag(:h1, title),
    subtitle && content_tag(:h3, subtitle)
  ].join.html_safe
end

Хотя это технически не эквивалентно - в него будут включены теги, даже если заголовок не нулевой, а пустой - он, вероятно, будет делать то, что вы хотите вэто дело.

Если вы хотите получить фантазию:

MAPPINGS = [[:title, "h1"], [:subtitle, "h3"]]
def page_header(options = {})
  MAPPINGS.map {|e| options[e[0]] && content_tag(e[1], options[e[0]]) }.join.html_safe
end

Затем вы можете позвонить:

page_header :title => "Foobar", :subtitle => "Woohoo"

И это будет работать.Я бы сказал, что второй помощник уродливее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...