Railsのhelperに TagHelper っていうのが text_area_tag のようなフォームを作成するような Helper がありますが、その内部で使用するようなメソッドが定義されています。

主に tag, content_tag になるのですが、自分でHTMLのタグを生成するようなヘルパーを生成したときこれを使うと便利です。

例えば hoge的なものを表現するタグを生成するhoge_tagという抽象化をしたいときにざっくりな実装をすると以下のようになります。

def hoge_tag(content)
  %Q{<div class="hoge">#{content}</div>}.html_safe
end
hoge_tag "hogehoge" # => "<div class=\"hoge goro\">hogehoge</div>"

しかし、つかっていくと個別に class属性を追加したくなる場合が多々ありますし、content の escape などもしないといけないです。

def hoge_tag(content, *classes)
  classes = ["hoge"] + classes
  class_string = classes.join(" ")
  %Q{<div class="#{class_string}">#{content}</div>}.html_safe
end
hoge_tag "hogehoge", "goro" # => "<div class=\"hoge goro\">hogehoge</div>"

もちろん、class属性だけじゃなくていろいろ指定したくなります。 text_area_tag なんかと同じようにoptionsで受けるようにしたい。こうなっとときに 「ソースを読もう!!」 という発想が出るようになると良いと思います。

def hoge_tag(content, options = nil)
  classes = options[:class]
  classes = [classes] unless Array === classes
  options[:class] = ["hoge"] + classes
  content_tag :hoge, content, options
end
hoge_tag "hogehoge", class: "goro"

content_tag はブロックを受けとったり, escapeの可否などの指定もできます。 ブロックをうけとるようなものはテンプレートエンジン内ではなかなかあばれてくれます。

<%= content_tag :hoge do %>
  "hogehoge"
<% end %>

といった書き方ができます。

<br />,<img />のような内部にコンテントを持たないタグを生成する場合は tagというメソッドを使うと良いです。

Viewを書きはじめる前に Helperの一覧をみておくのも良いと思います。