Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
64
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

【Rails】link_to / url_forなどリンク関連のビューヘルパーまとめ

Railsのlink_toや、url_forなど、リンク関連のビューヘルパーをまとめました。

link_to:ハイパーリンクの作成

使い方

link_to(リンクのテキスト , リンク先のURL [,あればオプション])

使えるオプション

オプション 概要
method リンク時に使用するHTTPメソッド
remote Ajaxでリンクを処理
date js動作に関するパラメータ(削除確認ダイアログなど)
属性名 idとか、classとか

使用例

・一番きほんてきなやつ

<%= link_to  'RailsGuides' , 'http://railsguides.jp/' %>
#=>  <a href ='http://railsguides.jp/'>RailsGuides</a>

・コントローラーとアクションから動的にURLを作成・id/classをつけたり

※この場合のurl、classなどのオプションの指定ともにハッシュを使っており、
メソッドに複数のハッシュを渡す場合は、前方(リンク先のURL側)のハッシュを{}で括る
括り忘れると、controller以降で一つの引数だとみなされ、URLになってしまう。

<%= link_to 'トップ' , {controller: :hello, action: :index} , id: :link, classl: :menu %>
#=>  <a href ="/hello" class="menu" id="link">トップ</a>

・HTTPメソッドを指定したり、リンククリック時にダイアログを表示してみたり

<%= link_to 'Destroy' , book_path(1) , method: :delete,data: {confirm: 'Are you sure?' } %>
#=>  <a data-confirm="Are you sure?" data-method="delete" href="/books/1" rel="nofollow">Destroy</a>

※rel属性のnofollow値はリンク先が圃場されないページランクに影響すべきでないことを検索エンジンに通知
※実際には、HTTPメソッドのDELETEもPATCHもPOSTで行われているが、RailsのRESTfulな思想を体現するため、このように書き、そうすることで、そのメソッドを利用しようとした、という情報を送っている。

・画像のリンクを作ってみたり

link_toには、引数としてimage_tag(画像ファイルのパス)を持つこともできる

<%= link_to image_tag("logo.png"), :action => "index" %>```
#=> <a href="/blogs"><img alt="Logo" src="/images/logo.png" /></a>

url_for:動的にURLを作成

link_toメソッドの引数指定は、url_forメソッドと同じなので、ついでに勉強しておきましょー。
引数に与える情報から動的にURLを作ってくれます。

使い方

url(URLの生成オプション)

使えるオプション

オプション 概要
controller コントローラー名
action アクション名
host ホスト名
protocol プロトコル
anchor アンカー名
only_path 相対URLを返すか。hostが指定されなかった場合、デフォルトはtrue
trailing_slash 末尾にスラッシュを付けるか
user HTTP認証に使用するユーザー名
password HTTP認証に使用するパスワード

使用例

・一番きほんてきなやつ

url_forは現在のコントローラーを基点にURLを作成する
そのため、下記のように、actionのみを指定した時は、コントローラーは現在のもの(hello)を使用する

<%= url_for(action: :new) %>
#=>  /hello/new

・idなど、パラメータを指定

charsetもクエリ情報に含まれることに注意

<%= url_for(controller: :books, action: :show, id: 5, anchor: 'rails' , charset: 'utf8' ) %>
#=> /books/5?charset=utf8#rails

・only_pathを使って、絶対パスを返す

<%= url_for(controller: :members, action: :login, only_path: false, protocol: 'https' ) %>
#=>  https://localhost:3000/members/login

・引数にオブジェクトを渡す

<% @book = Book.find(2) %>
<%= url_for(@book) %>
#=> /books/2

・特殊な用法

引数に「:back」を指定した場合は、url_forメソッドはRefererヘッダの値、つまり、現在のページのリンク元ページを表す。Refererヘッダが空の場合は、「javascript:history.back()」を返す

<%= url_for(:back) %>
#=> javascript:histroy.back()

※コントローラーで、url_forで渡すデフォルト値を設定できる

コントローラー側で、default_url_optionsメソッドをオーバーライドすることで、url_forメソッドにデフォルトで渡すパラメータを指定できる
以下はviewコントローラー配下の全てのリンクにcharsetパラメータを付与する例

def default_url_options ( options = {} )
  { charset: 'utf-8' }
end

link_to_if / link_to_unless:条件に応じてリンクを生成

使い方

link_to_if ( 条件式 , リンクのテキスト [,リンク先のURL , オプション ] , 代替コンテンツ )
link_to_unless ( 条件式 , リンクのテキスト [,リンク先のURL , オプション ] , 代替コンテンツ )
link_to_ifメソッドは、条件式がtrueの場合にはアンカータグを、falseの場合は引数nameに基いて、固定テキストのみを出力する。
代替コンテンツがある場合は、それを出力する。
link_to_unlessはこの逆。

使用例

<% @user = User.new %>
<%= link_to_if @user.nil? , 'ログイン' , controller: :login , action: :index %>
#=> <a href ="/login">ログイン</a>

link_to_inless_current:現在のページの場合はリンクを無効化

link_to_unlessメソッドの特殊系。リンク先が現在のページである場合は、テキストのみを出力。

使い方

link_to_unless_current ( リンクのテキスト [ , リンク先のURL ,オプション ] ,代替コンテンツ )

<%= link_to_unless_current '一覧へ' , action: :current %>|
<%= link_to_unless_current '詳細へ' , action: :detail %>
一覧へ|
<a href = "/view/detail">詳細へ</a>



以上です。

参考

本記事は以下を参考にして書きました。
Ruby on Rails4 アプリケーションプログラミング
RailsTutorial
Ruby on Railsドキュメント

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
64
Help us understand the problem. What are the problem?