

プロ太先生、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列のproducts
とproduct
です。
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の規約を理解しよう
Product
モデルのオブジェクトを渡すと- 自動的に
product_path(product.id)
に変換される - つまり
/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_path
とproduct_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ライフが快適に!

今日学んだことをまとめましょう!
今日のポイント
- **
link_to
**は<a>
タグを自動で作ってくれる便利なヘルパー - オブジェクトを直接渡すことで、パスが自動生成される
- Railsの規約により、コードが短く、読みやすくなる
- **
_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の世界はまだまだ奥が深いので、一緒に頑張って学んでいきましょう!