Railsにおけるリンクの記述方法とそのテスト


Ruby on Rails Tutorialのエッセンスを自分なりに整理してみる6

[Rails]TwitterBootstrapとSassとAssetPipeline
http://qiita.com/kidachi_/items/4c47b28b2a74c723d835
の続き。

Ruby on Rails Tutorial（chapter5）
http://railstutorial.jp/chapters/filling-in-the-layout#sec-layout_exercises


##Railsにおけるリンクの記述方法

```html
<a href="/static_pages/about">About</a>
```
というリンクは、ERB中では以下のように記述していく。

```ruby:erb
<%= link_to "About", about_path %>
```

「about_path」を名前付きルートと言う
→各パスに振られた変数のようなもの。

####各ページ、URLに対する名前付きルートの例

|ページ|	URL|	名前付きルート|
|-----|-----|-----|
|Home|	/|	root_path|
|About|	/about|	about_path|
|Help|	/help|	help_path|
|Contact|	/contact|	contact_path|
|Sign up|	/signup|	signup_path|
|Sign in|	/signin|	signin_path|


###名前付きルートの動作テスト

specファイルを編集。

```spec/requests/static_pages_spec.rb
visit '/static_pages/about'
```
　↓visit先を名前付きルートに置き換え

```spec/requests/static_pages_spec.rb
visit about_path
```
つまり以下のような形。

```spec/requests/static_pages_spec.rb
require 'spec_helper'

describe "Static pages" do
  ~
  describe "About page" do

    it "should have the h1 'About Us'" do
      visit about_path
      expect(page).to have_content('About Us')
    end

    it "should have the title 'About Us'" do
      visit about_path
      expect(page).to have_title("Ruby on Rails Tutorial Sample App | About Us")
    end
  end
  ~
end
```

当然この時点ではテストはRed。

### Red to Green（プロダクトコードの実装）

名前付きルートを定義するために、config/routes.rbを以下のように編集する。

```config/routes.rb
get 'static_pages/about'
```
　↓修正

```config/routes.rb
match '/about', to: 'static_pages#about', via: 'get'
```

これで、

- ’/about’（GETリクエスト）がStaticPagesControllerのaboutアクションにマッピングされる
- そのマッピング（パス）を返却するabout_pathという名前付きルートが生成される
 - 名前付きルートはControllerとViewで利用できる

※「match」を「get」にしても同じ名前付きルートになるが、
　 matchを利用する方がより「Railsっぽい」。

####定義される名前付きルートの中身

```
about_path -> '/about'
about_url  -> 'http://localhost:3000/about'
```
→`hoge_path`と`hoge_url`の二つが定義される

- '/hoge’のみを取得する場合はhoge_pathを使う。
- リダイレクトの場合のみhoge_url書式を使用する。
 - HTTP標準では技術的にリダイレクト後にフルURLが要求されるため。
 - （ただし、ほとんどのブラウザではどちらの方法でも動作する。）


###TOPページへのルートマッピング

通常通り、以下のようなコードを使用することも一応可能。

```config/routes.rb
match '/', to: 'static_pages#home', via: 'get'
```
しかし、実際にはルート (root) については上のように書く必要はなく、

```
root  'controller_name#action_name'
```
で表す。

```config/routes.rb
SampleApp::Application.routes.draw do
  root  'static_pages#home'
  match '/help',    to: 'static_pages#help',    via: 'get'
  match '/about',   to: 'static_pages#about',   via: 'get'
  match '/contact', to: 'static_pages#contact', via: 'get'
  ~
end
```
####root  'static_pages#home'で定義される名前付きルートの中身

```
root_path => '/'
root_url  => 'http://localhost:3000/'
```



## 「あるページからあるページへの遷移（リンク）」のテスト

```rb
visit foo_path
click_link "var"
```
で、「ページfooからリンクvarへの遷移」に対するテストが出来る。

```spec/requests/static_pages_spec.rb
require 'spec_helper'

describe "Static pages" do
  ~
  it "should have the right links on the layout" do
    visit root_path
    click_link "About"
    expect(page).to have_title(full_title('About Us'))
    click_link "Help"
    expect(page).to have_title(full_title('Help'))
    click_link "Contact"
    expect(page).to have_title(full_title('Contact'))
    click_link "Home"
    expect(page).to have_title(full_title(''))
    click_link "Sign up now!"
    expect(page).to have_title(full_title('Sign up'))
    click_link "sample app"
    expect(page).to have_title(full_title(''))
  end
end
```

## 以下に続く
[Rails] RSpecのリファクタリング
http://qiita.com/kidachi_/items/ec184deb106e4e5c90c3