Rails

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

More than 5 years have passed since last update.

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