『Ruby on Rails 5 アプリケーションプログラミング』を学習する8

Ruby on Rails 5アプリケーションプログラミング

Ruby on Rails 5アプリケーションプログラミング

序文

Ruby on Rails 5 アプリケーションプログラミング」学習8日目。
貧乏人に週末などない。

GitHub

github.com

進捗

  • 第4章
    • 4.2 文字列/数値関連のビューヘルパー
      (学習時間:4時間)

コード実装部分

↓/app/controllers/view_controller.rb

class ViewController < ApplicationController

  # 省略

  def conc
    @cds = Cd.all
  end

  def no_escape
    @msg = '<h1>h1</h1>';
  end  
end

↓/config/routes.rb

  # 省略

  get  'view/simple_format'

  get  'view/truncate'

  get  'view/excerpt'

  get  'view/highlight'

  get  'view/conc'

  get  'view/no_escape'

  get  'view/sanitize'

  get  'view/format'

  get  'view/number_to'

  get  'view/datetime'
end

↓/app/views/view/simple_format.html.erb

<%# simple_formatメソッドを使って文字列を整形する %>

<%# ヒアドキュメント(<<識別子~識別子)を使うことで
複数行の文字列をスマートに書ける %>

<%
article = <<EOL
パルミジャーノ・レッジャーノ

どんな味になりたいなんて
誰のもとに行きたいなんて
ずっとわかるわけないまんま
ささやかでも笑いながら運命を生きたいな

<script>alert('アミノ酸のかたまり');</script>
EOL
%>
<%= simple_format(article, class: :article) %>

<%# ↓出力されるHTML
<p class="article">パルミジャーノ・レッジャーノ</p>

<p class="article">どんな味になりたいなんて
<br />誰のもとに行きたいなんて
<br />ずっとわかるわけないまんま
<br />ささやかでも笑いながら運命を生きたいな</p>

<p class="article">alert('アミノ酸のかたまり');
</p> %>

<%= simple_format(article, {class: :article}, {sanitize: false, wrapper_tag: 'blockquote'}) %>

<%# ↓出力されるHTML
<blockquote class="article">パルミジャーノ・レッジャーノ</blockquote>

<blockquote class="article">どんな味になりたいなんて
<br />誰のもとに行きたいなんて
<br />ずっとわかるわけないまんま
<br />ささやかでも笑いながら運命を生きたいな</blockquote>

<blockquote class="article"><script>alert('アミノ酸のかたまり');</script>
</blockquote> 
%>

↓/app/views/view/truncate.html.erb

<% msg = '<strong>KICK THE CAN CREW</strong>KICK THE CAN CREW(キック・ザ・カン・クルー)は、日本のヒップホップグループ。所属レコード会社はビクターエンタテインメント(インディーズ、及びLP版はBURGER INN RECORDSでリリース)。通称「キック」、雑誌等では頭文字をとって「KTCC」とも表記される。グループ名を直訳すると「缶を蹴る奴ら」。その由来は、それぞれ活動していた3人が初めてコラボレートした楽曲「カンケリ」から来ている。RHYMESTER等が在籍するコミュニティFUNKY GRAMMAR UNITや神輿ロッカーズの一員でもある。' %>

<%# 先頭の100文字のみ表示。特殊文字は<% = %_>でエスケープされる %>
<%= truncate(msg, length: 100) %><br />
<%# &lt;strong&gt;KICK THE CAN CREW&lt;/strong&gt;KICK THE CAN CREW(キック・ザ・カン・クルー)は、日本のヒップホップグループ。所属レコード会社はビクターエンタ... %>

<%# 先頭から100文字を超えない範囲で、separatorが最後に登場するところまで表示 %>
<%= truncate(msg, length: 100, separator: '。') %><br />
<%# &lt;strong&gt;KICK THE CAN CREW&lt;/strong&gt;KICK THE CAN CREW(キック・ザ・カン・クルー)は、日本のヒップホップグループ... %>

<%# 切り捨てた文字列の部分の表示を設定 %>
<%= truncate(msg, length: 100, omission: '...後略...') %>
<%# &lt;strong&gt;KICK THE CAN CREW&lt;/strong&gt;KICK THE CAN CREW(キック・ザ・カン・クルー)は、日本のヒップホップグループ。所属レコード会社はビク...後略... %>

↓/app/views/view/excerpt.html.erb

<% msg = '<strong>KICK THE CAN CREW</strong>KICK THE CAN CREW(キック・ザ・カン・クルー)は、日本のヒップホップグループ。所属レコード会社はビクターエンタテインメント(インディーズ、及びLP版はBURGER INN RECORDSでリリース)。通称「キック」、雑誌等では頭文字をとって「KTCC」とも表記される。グループ名を直訳すると「缶を蹴る奴ら」。その由来は、それぞれ活動していた3人が初めてコラボレートした楽曲「カンケリ」から来ている。RHYMESTER等が在籍するコミュニティFUNKY GRAMMAR UNITや神輿ロッカーズの一員でもある。' %>

<%# キーワードの前後10文字ずつを抽出する %>
<%= excerpt(msg, 'ヒップホップ', radius: 10) %><br />

<%# 複数ある場合は最初に合致した部分 %>
<%= excerpt(msg, 'KICK', radius: 10) %><br />
<%# 全部抽出することはできないのだろうか… %>

<%# 省略部分の表示を設定 %>
<%= excerpt(msg, 'ビクター', radius: 10, omission: '~') %><br />

↓/app/views/yahoo/list.html.erb

<%# 省略 %>

<%# Ruby構文をそのまま埋め込める %>
<% @cds.each do |cd| %>
  <%# cycleメソッドの例 %>
  <%# eachメソッド配下で指定された値を順番に出力する %>
  <tr style="background-color:<%= cycle('#ffffff', '#FFff99') %>">
    <%# cycleの現在の値を取得する(背景と文字列が同色になる) %>
    <td style="color:<%= current_cycle %>" ><%= cd.jan %></td>
    <td><%= cd.title %></td>
    <td><%= cd.price %></td>
    <td><%= cd.label %></td>
    <td><%= cd.released %></td>
    <td><%= cd.is_major %></td>
  </tr>
<% end %>

</table>

↓/app/views/view/highlight.html.erb

<% msg = 'KICK THE CAN CREW(キック・ザ・カン・クルー)は、日本のヒップホップグループ。通称「キック」、雑誌等では頭文字をとって「KTCC」とも表記される。' %>

<%# キックの文字列をmarkタグで囲む %>
<%= highlight(msg, 'キック') %><br />
<%# ↓出力される文字列
KICK THE CAN CREW(<mark>キック</mark>・ザ・カン・クルー)は、日本のヒップホップグループ。通称「<mark>キック</mark>」、雑誌等では頭文字をとって「KTCC」とも表記される。 %>

<%# 任意の文字列で囲むこともできる。複数キーワードの指定も可能 %>
<%# \1はプレースホルダー %>
<%= highlight(msg, ['キック', 'KICK'],
  highlighter: '<a href="search?keywd=\1">\1</a>') %>
<%# ↓出力される文字列
<a href="search?keywd=KICK">KICK</a> THE CAN CREW(<a href="search?keywd=キック">キック</a>・ザ・カン・クルー)は、日本のヒップホップグループ。通称「<a href="search?keywd=キック">キック</a>」、雑誌等では頭文字をとって「KTCC」とも表記される。
%>

↓/app/views/view/conc.html.erb

<table>
  <tr>
    <th>ISBNコード</th><th>書名</th><th>価格</th>
    <th>出版社</th><th>刊行日</th><th>ダウンロード</th>
  </tr>

<% @cds.each do |cd| %>
  <tr>
    <td><%= cd.jan %></td>
    <td><%= cd.title %></td>
    <td><%= cd.price %><%# concatメソッドを使うことでスクリプトタグの内部で出力を行うことができる %>
      <% if cd.price >= 3000
        concat image_tag 'expensive.gif'
      end %>
    </td>
<%
=begin
%>
    <td><%= cd.price %><% if cd.price >= 3000 %>
      <%= image_tag 'expensive.gif' %>
    <% end %>
    </td>
<%
=end
%>
    <td><%= cd.label %></td>
    <td><%= cd.released %></td>
    <td><%= cd.is_major %></td>
  </tr>
<% end %>
</table>

↓/app/views/view/no_escape.html.erb

<p>%=の場合</p>
<%= @msg %>
<p>%==の場合</p>
<%== @msg %>

↓/app/views/view/sanitize.html.erb

<%# sanitizeメソッドの挙動について %>

<%
msg = <<EOL
<p style="color:Red">CUEZERO<br />ってまだ活動してるんですか</p>
<strong id="hoge" class="myclazz">至急</strong>
<a href="JavaScript:alert('NG')">こちらに回答お願いします。</a>
<a href="https://ja.wikipedia.org/wiki/CUEZERO">Wikipedia</a>
EOL
%>
<%= sanitize msg %>
<%# 
<p>CUEZERO<br>ってまだ活動してるんですか</p>
<strong class="myclazz">至急</strong>
<a>こちらに回答お願いします。</a>
<a href="https://ja.wikipedia.org/wiki/CUEZERO">Wikipedia</a> 
%>
<hr />
<%# 特定のタグや属性のみを許可 %>
<%= sanitize msg, tags: %w(p a), attributes: %w(id class href style) %>
<%# 
<p style="color:Red;">CUEZEROってまだ活動してるんですか</p>
至急
<a>こちらに回答お願いします。</a>
<a href="https://ja.wikipedia.org/wiki/CUEZERO">Wikipedia</a> 
%>
<%# JavaScript疑似プロトコルは常に除去される %>

↓/app/views/view/format.html.erb

<%
string = 'KICK THE CAN CREW'
float  = 908.79
int = 11
%>
文字列を10ケタで表示する<br>
<%= sprintf('%.10s', string) %><br>
整数を表示する<br>
<%= sprintf('%d', int) %><br>
小数を小数点以下1ケタで表示する<br>
<%= sprintf('%.1f', float) %>

↓/app/views/view/number_to.html.erb

<p>数値を通過形式(デフォルトはドル)に変換</p>
<%= number_to_currency(12345) %><br />
<%# $12,345.00 %>
<p>数値を通貨形式(円)に変換</p>
<%= number_to_currency(12345, unit: '円', precision: 0, format: '%n%u') %><br />
<%# 12,345円 %>
<p>数値をMillionなどの単位に変換</p>
<%= number_to_human(1234567) %><br />
<%# 1.23 Million %>
<p>数値をMillionの単位に変換(日本語化)</p>
<%= number_to_human(1234567, units: { unit: "", million: "百万" }) %><br />
<%# 1.23 百万 %>
<p>バイト単位に変換(…使うか?)</p>
<%= number_to_human_size(123456) %><br />
<%# 121 KB %>
<p>%単位に変換</p>
<%= number_to_percentage(12.3456) %><br />
<%# 12.346% %>
<p>区切り文字をスラッシュに、小数点をコロンに変更する</p>
<%= number_with_delimiter(1234567.89, delimiter: "/", separator: ":") %> <br />
<%# 1/234/567:89  %>
<p>区切り文字を設定し、デフォルトの小数点以下3ケタでまるめる</p>
<%= number_with_precision(111123.4567, delimiter: ",") %><br />
<%# 111,123.457 %>
<p>小数点以下5ケタでまるめる</p>
<%= number_with_precision(123.4567, precision: 5) %><br />
<%# 123.45670 %>
<p>小数を全体桁数5ケタでまるめる</p>
<%= number_with_precision(123.4567, precision: 5, significant: true) %><br />
<%# 123.46 %>
<p>小数を全体桁数5ケタでまるめ、小数点以下の0を削除する</p>
<%= number_with_precision(123.4, precision: 5, strip_insignificant_zeros: true) %>
<%# 123.4  %>

↓/app/views/view/datetime.html.erb

<% @current = Time.now %>
<%= @current.strftime('%Y年%-m月%-d日 %-H:%M:%S') %>
<%# 2018年3月31日 7:03:02   %>

実行結果

f:id:yjkym:20180331170326p:plain

感想

長くなるからどうしようかなと思ったんだけど、とりあえずソースコードも貼っていくことにした。
ビュー表示関連のヘルパーこんなにいっぱいあるんだ…。
そのまま取り出して、rubyでしこしこ整形ばっかりしてた。
こういう「あったことに気づく」ってのは体系的に勉強しないとなかなか気づかない。
体系的な勉強大事。

sprintf()とかstrftime()の使い方とか一向に覚えられない。
sprintf()は【%[フラグ][幅][.精度]型】…φ(..)メモメモ
カロリーメイトください。

BGM

パルミジャーノ・レッジャーノ / つしまみれ www.youtube.com