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

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

#link_to：ハイパーリンクの作成
##使い方
`link_to（リンクのテキスト , リンク先のURL [,あればオプション]）`

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

##使用例
####・一番きほんてきなやつ

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

####・コントローラーとアクションから動的にURLを作成・id/classをつけたり
※この場合のurl、classなどのオプションの指定ともにハッシュを使っており、
メソッドに複数のハッシュを渡す場合は、前方（リンク先のURL側）のハッシュを｛｝で括る
括り忘れると、controller以降で一つの引数だとみなされ、URLになってしまう。

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

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

```rb
<%= link_to 'Destroy' , book_path(1) , method: :delete,data: {confirm: 'Are you sure?' } %>
```
```html
#=>  <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（画像ファイルのパス）を持つこともできる

```rb
<%= link_to image_tag("logo.png"), :action => "index" %>```
```
```html
#=> <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）を使用する

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

####・idなど、パラメータを指定
charsetもクエリ情報に含まれることに注意

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

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

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

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

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

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

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

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

```rb
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はこの逆。

##使用例

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

#link_to_inless_current：現在のページの場合はリンクを無効化
link_to_unlessメソッドの特殊系。リンク先が現在のページである場合は、テキストのみを出力。
##使い方
`link_to_unless_current ( リンクのテキスト [ , リンク先のURL ,オプション ] ,代替コンテンツ ) `

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

<hr>
以上です。

#参考
本記事は以下を参考にして書きました。
[Ruby on Rails4 アプリケーションプログラミング](https://www.amazon.co.jp/Ruby-Rails-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4774164100)
[RailsTutorial](http://railstutorial.jp/chapters/filling_in_the_layout?version=4.2)
[Ruby on Railsドキュメント](http://railsdoc.com/)