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

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

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

序文

Ruby on Rails 5 アプリケーションプログラミング」学習9日目。
さっそくエイプリルフールにだまされた気がする。
大したことないアカでエイプリルフールネタなんかやるんじゃねぇ。

GitHub

github.com

進捗

  • 第4章
    • 4.3 リンク関連のビューヘルパー
      (学習時間:2.5時間)

コード実装部分

↓/config/routes.rb

# 省略

  get  'view/link'

  get  'view/urlfor'
  get  'view/new'
  get  'members/login'

  get  'login/index'
  get  'login/info'

  get  'view/linkif'

  get  'view/current'
  get  'view/detail'

  get  'view/mailto'
end

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

<%# link_toメソッドの使い方 %>

<%# シンプルな例 %>
<%= link_to 'はてブ', 'http://yjkym.hatenablog.com/' %>
<%# <a href="http://yjkym.hatenablog.com/">はてブ</a> %>

<%# コントローラーとアクションを指定する %>
<%= link_to 'トップ', { controller: :yahoo, action: :index },
  id: :link, class: :menu %>
<%# URLを指定する部分を{}で囲ってオプションと区別してやる必要がある %>
<%# ↓こっちのほうが分かりやすいかも %>
<%# <%= link_to 'トップ', {controller: :yahoo, action: :index}, {id: :link, class: :menu} %_> %>

<%# ビューヘルパーを使用してURLを指定する例 %>
<%# cd_path({id値})はcds/{id値}のパスを返す %>
<%# :deleteはHTTPメソッドの指定(アクション名ではない) %>
<%= link_to '削除', cd_path(1),
  { method: :delete, data: { confirm: '削除しても良いですか?'} } %>
<%# <a data-confirm="削除しても良いですか?" rel="nofollow" data-method="delete" href="/cds/1">削除</a> %>

<%# ブロックを使うとブロックの中身がリンクテキストになるっぽい %>
<%# ちゃんと説明してほしい %>
<% @cd = Cd.find(1) %>
<%= link_to cd_path(@cd) do
  image_tag "http://kankeli.net/review100/images/cd/shuudankoudou_juubunmirai.jpg"
end %>
<%# <a href="/cds/1"><img src="http://kankeli.net/review100/images/cd/shuudankoudou_juubunmirai.jpg" alt="Shuudankoudou juubunmirai" /></a> %>

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

<%# url_forメソッドでURLを生成する例 %>
<%# link_toメソッドのURL指定も同様に行える %>

<%# ルート定義を元にURLを生成する %>

<%# アクションのみを指定した場合は現在のコントローラーからのリンクを生成する %>
<%= url_for(action: :new) %><br />
<%# /view/new %>

<%# コントローラーとアクションを指定した例 %>
<%# ↓routes.rbを参照して適切なURLを生成してくれる %>
<%# # GET    /cds/:id(.:format)      cds#show %>
<%= url_for(controller: :cds, action: :show, id: 5,
  anchor: 'rails', charset: 'utf8') %><br />
<%# /cds/5?charset=utf8#rails %>

<%# only_pathをfalseにすることで絶対URLで返す %>
<%= url_for(action: :login, controller: :members,
  only_path: false, protocol: 'https') %><br />
<%# https://localhost:3000/members/login %>

<%# オブジェクトを直接渡す例 %>
<%# 主キーからURLを生成する %>
<% @cd = Cd.find(2) %>
<%= url_for(@cd) %><br />
<%# /cds/2 %>

<%# ブラウザバックのやつ %>
<%= url_for(:back) %>
<%# javascript:history.back() %>

<%# コントローラーでdefault_url_optionsメソッドを %>
<%# オーバーライドすることでURLのデフォルト設定を変更することができる %>
<%# ↓コントローラーに書く %>
<%# def default_url_options(options={}) %>
<%# { %>
<%# charset: 'utf-8' %>
<%# } %>
<%# end %>

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

<%# link_to_if/link_to_unlessの例 %>

<% @listener = Listener.new %>

<%# 第一引数がtrueならリンクを生成し、 %>
<%# falseならリンクのない固定テキストを生成する %>
<%= link_to_if @listener.nil?, 'ログイン',
  controller: :login, action: :index %><br />
<%# <a href="/login/index">ログイン</a><br /> %>
<%# (falseならテキストのみ) %>

<%# falseならリンクを生成する。link_to_ifの逆 %>
<%= link_to_unless @listener, 'ログイン',
  controller: :login, action: :index %><br />
<%# 出力結果は上と同じ %>

<%# ブロックを渡すと、falseのときにはブロック内の処理を行う %>
<%# 多分だけど使わないと思う(普通に条件分岐で書きたい) %>
<%= link_to_if @listener.nil?, 'ログイン',
  controller: :login, action: :index do |name|
  link_to 'マイページ', controller: :login, action: :info
end %>
<%# ↓Trueの場合 %>
<%# <a href="/login/index">ログイン</a> %>
<%# ↓Falseの場合 %>
<%# <a href="/login/info">マイページ</a> %>

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

<%# link_to_unless_currentメソッドの使い方 %>

<%# リンク先が現在のページである場合にはリンクを生成しない %>
<%= link_to_unless_current '一覧へ', action: :current %><%= link_to_unless_current '詳細へ', action: :detail %>
<%# 一覧へ|<a href="/view/detail">詳細へ</a> %>

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

<%# mail_toメソッドの使い方 %>

<%# メアドのみ指定 %>
<%= mail_to 'caloriemate@please.com' %><br />
<%# <a href="mailto:caloriemate@please.com">caloriemate@please.com</a><br /> %>

<%# リンクテキストを指定 %>
<%= mail_to 'caloriemate@please.com', 'カロリーメイトはこちら' %><br />
<%# <a href="mailto:caloriemate@please.com">カロリーメイトはこちら</a><br /> %>

<%# メールの内容もいろいろ指定できる %>
<%# 使わないと思う %>
<%= mail_to 'caloriemate@please.com', nil,
  subject: 'あげます', cc: 'caloriemate@give.you.to' %>
<%# <a href="mailto:caloriemate@please.com?cc=caloriemate%40give.you.to&amp;subject=%E3%81%82%E3%81%92%E3%81%BE%E3%81%99">caloriemate@please.com</a> %>

実行結果

f:id:yjkym:20180401152611p:plain

感想

今日はリンク関連のビューヘルパーの基本的な使い方について。
ちょうどいい難易度。
最近、ようやくコントローラーとか指定する方法を覚えました。(直接URLばっかり書いてた)
Rubyの理解があやしいので、もうひとつ書籍を買いました。

1冊まるまる取り組む時間はとれないと思うので、リファレンス的に使えるかなーと思っていたんですが、割とさっとひけて助かりました。

  # url_forメソッドなどで返すURLのデフォルト設定の変更
  # options={}はデフォルト値付きの引数を設定している
  # Rubyではreturnを省略する(ややこい)
  def default_url_options(options={})
    {
      charset: 'utf-8'
    }
  end

関数内部の括弧の部分自体が返り値になってるとかなかなか気づかないよねぇ。
こういう省略上等なRubyの記法、本当やだ。
カロリーメイトください。

BGM

充分未来 / 集団行動 www.youtube.com