LoginSignup
72
72

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-11-25

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におけるリンクの記述方法

<a href="/static_pages/about">About</a>

というリンクは、ERB中では以下のように記述していく。

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_pathhoge_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/'

「あるページからあるページへの遷移(リンク)」のテスト

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

72
72
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
72
72