Rails初心者必見!link_toヘルパーで簡単リンク作成

プロ太先生、RailsでHTMLでリンクを作るのって面倒くさいです..

<!-- 商品一覧ページのコード -->
<h1>Products</h1>

<div id="products">
  <% @products.each do |product| %>
    <div>
      <!-- 手動でaタグを書いている -->
      <a href="/products/<%= product.id %>">
        <%= product.name %>
      </a>
    </div>
  <% end %>
</div>

確かにこの書き方だと、<a>タグを手動で書いて、さらにproduct.idを埋め込んで…と面倒ですよね。
実は、Railsにはもっと簡単な方法があるんです

link_toヘルパーの魔法を教えよう!

Railsにはlink_toというヘルパーメソッドがあります。これを使うと、リンクがとても簡単に作れるんです。

ヘルパーメソッド?

簡単に言うと、よく使う処理を簡単にしてくれる便利な関数のことです。link_to<a>タグを自動で作ってくれます。

基本的な使い方

# 基本の書き方
link_to "表示する文字", "リンク先のパス"

# 例
link_to "ホームページ", "/home"
# ↓ これが以下のHTMLに変換される
# <a href="/home">ホームページ</a>

おお!これは便利そうですね!

でも、商品の詳細ページのリンクはどう書けばいいんですか?商品のIDを使わないといけないですよね?

実は、Railsにはさらにすごい機能があるんです。

<!-- 従来の書き方 -->
<a href="/products/<%= product.id %>">
  <%= product.name %>
</a>

<!-- link_toを使った新しい書き方 -->
<%= link_to product.name, product %>

え?productだけ?IDは?

そこがRailsの魔法なんです!Railsは賢いので、productオブジェクトを渡すだけで、自動的に適切なパスを作ってくれるんです。

Railsの規約(Convention)を理解しよう!

まず、bin/rails routesというコマンドを実行してみてください。

Prefix Verb   URI Pattern                     Controller#Action
products GET    /products(.:format)            products#index
product GET    /products/:id(.:format)         products#show

これは何ですか?

これはルーティング情報です。注目してほしいのはPrefix列productsproductです。

Railsが自動で作ってくれるヘルパーメソッド

# Prefix が "products" の場合
products_path  # => "/products" を生成
products_url   # => "http://localhost:3000/products" を生成

# Prefix が "product" の場合
product_path(1)  # => "/products/1" を生成
product_url(1)   # => "http://localhost:3000/products/1" を生成

なるほど!product_pathを使えばいいんですね!

<%= link_to product.name, product_path(product.id) %>

その通り!でも、実はもっと簡単にできるんです。

「オブジェクトを直接渡す魔法!」

Railsでは、オブジェクトを直接渡すことができます。

<!-- この書き方 -->
<%= link_to product.name, product %>

<!-- ↓ Railsが自動でこう変換してくれる -->
<%= link_to product.name, product_path(product.id) %>

<!-- ↓ さらに具体的には -->
<%= link_to product.name, "/products/#{product.id}" %>

すごい!なんでproductだけでパスが分かるんですか?

Railsの規約を理解しよう

  1. Productモデルのオブジェクトを渡すと
  2. 自動的にproduct_path(product.id)に変換される
  3. つまり/products/1のようなパスが生成される
# 例:productのIDが5の場合
product = Product.find(5)
link_to product.name, product
# ↓ 自動的にこうなる
# <a href="/products/5">商品名</a>

規約って何ですか?

「決まったルール」のことです。Railsでは「こう書いたら、こう動く」というルールがたくさんあります。このルールに従うことで、コードがとても短く、読みやすくなるんです。

じゃあ、実際に書き換えてみますね!

<!-- 【Before】従来の書き方 -->
<h1>Products</h1>

<div id="products">
  <% @products.each do |product| %>
    <div>
      <!-- 手動でaタグとパスを書いている -->
      <a href="/products/<%= product.id %>">
        <%= product.name %>
      </a>
    </div>
  <% end %>
</div>
<!-- 【After】link_toを使った書き方 -->
<h1>Products</h1>

<div id="products">
  <% @products.each do |product| %>
    <div>
      <!-- link_toでスッキリ! -->
      <%= link_to product.name, product %>
    </div>
  <% end %>
</div>

素晴らしい!コードがとてもスッキリしましたね!

他の例も見てみよう!

他のモデルでも同じように使えますよ。

<!-- ユーザー詳細ページへのリンク -->
<%= link_to user.name, user %>
<!-- 生成される:<a href="/users/5">田中太郎</a> -->

<!-- 記事詳細ページへのリンク -->
<%= link_to article.title, article %>
<!-- 生成される:<a href="/articles/10">記事のタイトル</a> -->

<!-- カテゴリー詳細ページへのリンク -->
<%= link_to category.name, category %>
<!-- 生成される:<a href="/categories/3">技術</a> -->

すごい!どのモデルでも同じように使えるんですね!

_pathと_urlの違いは?

さっき、product_pathproduct_urlって出てきましたが、何が違うんですか?

普通のWebページでは_pathを使います。_urlメール外部サイトに送るリンクで使います。

# _path:相対パス(ドメインなし)
product_path(1)  # => "/products/1"

# _url:絶対URL(ドメインあり)
product_url(1)   # => "http://localhost:3000/products/1"
# Webページ内のリンク(普通はこっち)
link_to "商品詳細", product_path(product)

# メールで送るリンク(完全なURLが必要)
link_to "商品詳細", product_url(product)

まとめ:link_toでRailsライフが快適に!

今日学んだことをまとめましょう!

今日のポイント

  1. **link_to**は<a>タグを自動で作ってくれる便利なヘルパー
  2. オブジェクトを直接渡すことで、パスが自動生成される
  3. Railsの規約により、コードが短く、読みやすくなる
  4. **_pathは相対パス、_url**は絶対URL

Before → After比較

<!-- 【Before】面倒な書き方 -->
<a href="/products/<%= product.id %>">
  <%= product.name %>
</a>

<!-- 【After】スッキリした書き方 -->
<%= link_to product.name, product %>

link_toを使うと、こんなに簡単になるんですね!Railsってすごいです!

その通り!Railsは「Convention over Configuration(設定より規約)」という哲学があります。決まったルールに従うことで、少ないコードで多くのことができるようになるんです。

今度から積極的にlink_toを使ってみます!ありがとうございました!

どういたしまして!Railsの世界はまだまだ奥が深いので、一緒に頑張って学んでいきましょう!