ã¦ã¼ã¶ã¼èªè¨¼ã®ãã¹ãï¼1ï¼ -- Outside-In
2013/08/31
ä»åãããã°ããã®éãã¦ã¼ã¶ã¼èªè¨¼æ©è½ããã¹ãé§åéçºæ¹å¼ã§å®è£ ãã¦ããã¾ããããããããã°ã¤ã³ã»ãã°ã¢ã¦ãæ©è½ãã§ãã
åã«ã¦ã¼ã¶ã¼ãèªè¨¼ããã ãã§ã¯åç´ãããã®ã§ãã¦ã¼ã¶ã¼ã«ããã°ã¤ã³ãã¤ã³ãããä»ä¸ãããã¨ã«ãã¾ããããªãã¡ãæã ã®ãµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ Sinope ã«ããã¤ã³ããããããã¨ããæ¦å¿µãå°å ¥ããã¦ã¼ã¶ã¼ããã°ã¤ã³ãããã¦ã¼ã¶ã¼ã®ãã¤ã³ããå¢ããã¨ããä»æ§ã追å ããã®ã§ãã
ã©ãã§ããé¢ç½ããã§ããï¼
宿é¡ã®çãåãã
ãã¦ãååã®ã¢ãã«ãã¹ãã®æ¼ç¿ã§ã¯ãèªè ã®çããã«å®¿é¡ãæ示ãã¾ããããã®çãåããããã¾ãããã
1åç®ã¯ããå§ããªã¬ãã¨åããªã¬ãã¯ã«ã¿ã«ãã®ã¿ãã®ãã¹ãããã³ããªãã¼ã·ã§ã³ã®å®è£ ãè¡ããã¨ã§ãããããã¦ã2åç®ã¯ããããåè§ã«ãã¯å ¨è§ã«ãã«èªåå¤æãããã¨ããä»æ§ã®ãã¹ãã¨å®è£ ã§ãã以ä¸ãæçµçãªçµæã®ã¿ã示ãã¾ãã
ãã¹ã spec/models/customer_spec.rb
ã®ã³ã¼ãã¯æ¬¡ã®ããã«ãªãã¾ãï¼
require 'spec_helper' describe Customer do let(:customer) { FactoryGirl.build(:customer) } specify '妥å½ãªãªãã¸ã§ã¯ã' do expect(customer).to be_valid end %w{family_name given_name family_name_kana given_name_kana}.each do |column_name| specify "#{column_name} ã¯ç©ºã§ãã£ã¦ã¯ãªããªã" do customer[column_name] = '' expect(customer).not_to be_valid expect(customer.errors[column_name]).to be_present end specify "#{column_name} ã¯40æå以å " do customer[column_name] = 'ã¢' * 41 expect(customer).not_to be_valid expect(customer.errors[column_name]).to be_present end specify "#{column_name} ã«å«ã¾ããåè§ã«ãã¯å ¨è§ã«ãã«å¤æãã¦åãå ¥ãã" do customer[column_name] = 'アイウ' expect(customer).to be_valid expect(customer[column_name]).to eq('ã¢ã¤ã¦') end end %w{family_name given_name}.each do |column_name| specify "#{column_name} ã¯æ¼¢åãã²ããªããã«ã¿ã«ããå«ãã§ããã" do customer[column_name] = 'äºãã¢' expect(customer).to be_valid end specify "#{column_name} ã¯æ¼¢åãã²ããªããã«ã¿ã«ã以å¤ã®æåãå«ã¾ãªã" do ['A', '1', '@'].each do |value| customer[column_name] = value expect(customer).not_to be_valid expect(customer.errors[column_name]).to be_present end end end %w{family_name_kana given_name_kana}.each do |column_name| specify "#{column_name} ã¯ã«ã¿ã«ããå«ãã§ããã" do customer[column_name] = 'ã¢ã¤ã¦' expect(customer).to be_valid end specify "#{column_name} ã¯ã«ã¿ã«ã以å¤ã®æåãå«ã¾ãªã" do ['äº', 'A', '1', '@'].each do |value| customer[column_name] = value expect(customer).not_to be_valid expect(customer.errors[column_name]).to be_present end end specify "#{column_name} ã«å«ã¾ããã²ãããªã¯ã«ã¿ã«ãã«å¤æãã¦åãå ¥ãã" do customer[column_name] = 'ããã' expect(customer).to be_valid expect(customer[column_name]).to eq('ã¢ã¤ã¦') end end end
ããã¦ãapp/models/customer.rb
ã®ã³ã¼ãã¯æ¬¡ã®éãï¼
require 'nkf' class Customer < ActiveRecord::Base validates :family_name, :given_name, :family_name_kana, :given_name_kana, presence: true, length: { maximum: 40 } validates :family_name, :given_name, format: { with: /\A[\p{Han}\p{Hiragana}\p{Katakana}]+\z/, allow_blank: true } validates :family_name_kana, :given_name_kana, format: { with: /\A\p{Katakana}+\z/, allow_blank: true } before_validation do self.family_name = NKF.nkf('-w', family_name) if family_name self.given_name = NKF.nkf('-w', given_name) if given_name self.family_name_kana = NKF.nkf('-wh2', family_name_kana) if family_name_kana self.given_name_kana = NKF.nkf('-wh2', given_name_kana) if given_name_kana end end
NKF ã¯ããã©ã«ãã§ããããåè§ã«ããå
¨è§ã«ãã«å¤æããã®ã§ãnkf
ã¡ã½ããã«ä¸ãããªãã·ã§ã³ã¯åºåæåã³ã¼ãã示ã -w
ã®ã¿ã§æ§ãã¾ããã
ãã®æç« ãçºè¡¨ããå¾ã«ãããªãã¼ã·ã§ã³ã³ã¼ãã®ä¸åã«æ°ä»ãã¾ããããã¼ã¸æ«å°¾ã®ãè£éºããã覧ãã ããã
ã¦ã¼ã¶ã¼èªè¨¼æ©è½ã®ä»æ§
åé ã§èª¬æããããã«ãæã ã¯ãµã³ãã« Rails ã¢ããªã±ã¼ã·ã§ã³ Sinope ã«ããã¤ã³ããããããã¨ããæ¦å¿µãå°å ¥ããã¦ã¼ã¶ã¼ããã°ã¤ã³ããæã«ããã°ã¤ã³ãã¤ã³ãããä»ä¸ãããã¨ã«ãã¾ãã
詳細ãªä»æ§ã¯ä»¥ä¸ã®éãã§ãï¼
- ãã°ã¤ã³åã®ã¦ã¼ã¶ã¼ãããããã¼ã¸ã®URLã«ã¢ã¯ã»ã¹ããã¨ãé常ã®ããããã¼ã¸ã®ä»£ããã«ãã°ã¤ã³ãã©ã¼ã ã表示ãããã
- ã¦ã¼ã¶ã¼ããã°ã¤ã³ãã©ã¼ã ã«æ£ããã¦ã¼ã¶ã¼åï¼usernameï¼ã¨ãã¹ã¯ã¼ãï¼passwordï¼ãå ¥åãã¦ããã°ã¤ã³ããã¿ã³ãã¯ãªãã¯ããã¨ãé常ã®ããããã¼ã¸ã表示ãããã
- ãã°ã¤ã³ã«å¤±æããå ´åã¯ããã¦ã¼ã¶ã¼åã¾ãã¯ãã¹ã¯ã¼ããæ£ããããã¾ããããã¨ããã¡ãã»ã¼ã¸ã¨ãã°ã¤ã³ãã©ã¼ã ã表示ãããã
- ã¦ã¼ã¶ã¼ãããããã¼ã¸ã®ããã°ã¢ã¦ãããªã³ã¯ãã¯ãªãã¯ããã¨ããæ¬å½ã«ãã°ã¢ã¦ããã¾ããï¼ãã¨ããè¦åãã¤ã¢ãã°ã表示ããããOKããã¿ã³ãã¯ãªãã¯ããã¨ãããã°ã¢ã¦ããã¾ãããã¨ããã¡ãã»ã¼ã¸ã¨ãã°ã¤ã³ãã©ã¼ã ã表示ãããã
- ã¦ã¼ã¶ã¼ããã°ã¤ã³ã«æåããã¨ãããã°ã¤ã³ãã¤ã³ããã¨ãã¦ã¦ã¼ã¶ã¼ã«1ãã¤ã³ããä¸ããããã
- ãã ããããã°ã¤ã³ãã¤ã³ããã¯ã¦ã¼ã¶ã¼ãã¨ã«1æ¥1åããä¸ããããªããæ¥ã®åºåãã¯æ¥æ¬æéåå5æã¨ããã
- ã¾ããåææ¥ã«ãã°ã¤ã³ããã¨ãé常ã®ããã°ã¤ã³ãã¤ã³ããã®ä»ã«ãåæãã°ã¤ã³ãã¼ãã¹ãã¨ãã¦2ãã¤ã³ããä¸ããããã
ããªãè¤éãªä»æ§ã§ããããããæ©è½ããã¹ãã®å©ããåããã«å®è£ ãããã¨è©¦ã¿ãã®ã¯ç¡è¬ã§ãã
ã©ãããçæããã
ä¸è¨ã®ãããªè¤éãªä»æ§ã示ãããã¨ãåå¿è ã®æ¹ã¯ã©ãããæãä»ãã¦è¯ãã®ãããããªããªãã¾ãã
ãã¼ã¿ãã¼ã¹ã®ã¹ãã¼ãè¨è¨ããå§ããã®ããã¦ã¼ã¶ã¼ãèªè¨¼ããã¡ã½ãããå®è£ ããã®ãããã°ã¤ã³ãã©ã¼ã ã®HTMLã¨CSSãçµãã§ã¿ãã®ãããããã¯APIãåºããã®ãâ¦
ããã¤ãã¢é§åéçºï¼BDDï¼ã®ååã®ä¸ã¤ã« Outside-In ã¨ããèãæ¹ãããã¾ããå¤å´ï¼ã¦ã¼ã¶ã¼ã¤ã³ã¿ã¼ãã§ã¼ã¹ãªã©ï¼ããå å´ï¼ãã¸ãã¹ãã¸ãã¯ããã¼ã¿æ§é ï¼ã«åãã£ã¦å®è£ ãé²ããã¹ããã¨ãããã®ã§ãããªã Outside-In ã®ååã«å¾ãã¨ããã®ããããããå¾ãã¹ãããã¨ããçåã¯ãã£ããå¿ãããã¨ã«ãã¾ããããã¾ãã¯è©¦ãã¦ã¿ãã®ãä¸çªã§ãã
æ©éãã¦ã¼ã¶ã¼ã¤ã³ã¿ã¼ãã§ã¼ã¹ããå®è£ éå§ããã¡ãããå®è£ ã®åã«ãã¹ããæ¸ãã¾ãã
ãã°ã¤ã³æ©è½ã®ãã¹ã
æ°è¦ãã¡ã¤ã« spec/features/login_and_logout_spec.rb
ã次ã®ãããªå
容ã§ä½æãã¦ãã ããã
require 'spec_helper' describe 'ãã°ã¤ã³' do specify 'ã¦ã¼ã¶ã¼èªè¨¼æå' do visit root_path within('form#new_session') do fill_in 'username', with: 'taro' fill_in 'password', with: 'correct_password' click_button 'ãã°ã¤ã³' end expect(page).not_to have_css('form#new_session') end specify 'ã¦ã¼ã¶ã¼èªè¨¼å¤±æ' do visit root_path within('form#new_session') do fill_in 'username', with: 'taro' fill_in 'password', with: 'wrong_password' click_button 'ãã°ã¤ã³' end expect(page).to have_css('p.alert', text: 'ã¦ã¼ã¶ã¼åã¾ãã¯ãã¹ã¯ã¼ããæ£ããããã¾ããã') expect(page).to have_css('form#new_session') end end
2ã¤ã®ã¨ã°ã¶ã³ãã«ãããã第1ã®ã¨ã°ã¶ã³ãã«ã§ããã°ã¤ã³æåãã®ã·ããªãªã第2ã®ã¨ã°ã¶ã³ãã«ã§ããã°ã¤ã³å¤±æãã®ã·ããªãªãè¨è¿°ãã¦ãã¾ããããããã®1è¡ç®ã«ãã visit root_path
ã¯ããã§ã«RSpec/Capybara -- ã¯ããã®ä¸æ©ã§èª¬æãã¾ããããURL ãã¹ /
ã«ã¢ã¯ã»ã¹ãããã¨ããæå³ã§ãã
within(...)
ã¯ãã...
ã®å
å´ã§ãã¨ããæå³ã§ããå¼æ°ã® form#new_session
㯠new_session
ã¨ãã id å±æ§ãæ㤠form
è¦ç´ ãæã CSS ã»ã¬ã¯ã¿ã§ããç¶ã do ... end
ãããã¯å
ã®ã¡ã½ããã¯ãHTML ææ¸ã®è©²å½é¨åã ãã対象ã¨ãªãã¾ãã
fill_in
ã¯å
¥åãã©ã¼ã ã®ããã¹ããã£ã¼ã«ãã¾ãã¯ãã¹ã¯ã¼ããã£ã¼ã«ãã«å¤ãå
¥åããã¡ã½ããã§ãã第1å¼æ°ã«ã¯ãã£ã¼ã«ãã®ååãæå®ããwith
ãªãã·ã§ã³ã«å
¥åããæååãæå®ãã¾ããããã§ã¯ username
ã¨ããååãæã¤ããã¹ããã£ã¼ã«ãã«ãtaroãã¨ããæååãå
¥åãããã¹ã¯ã¼ããã£ã¼ã«ãã«ã¯ãcorrect_passwordãããã³ãwrong_passwordãã¨ããæååãå
¥åãã¦ãã¾ãã
click_button
ã¯ãæåéããã¿ã³ãã¯ãªãã¯ããã¡ã½ããã§ãããã¿ã³ã®ä¸ã«æããã¦ããæååï¼ç»åãã¿ã³ã®å ´å㯠alt
å±æ§ã«æå®ããã¦ããæååï¼ãå¼æ°ã«æå®ãã¾ããããã§ããããã¿ã³ãã«ã¯ã以ä¸ã® HTML è¦ç´ ãå«ã¾ãã¾ãï¼
- éä¿¡ãã¿ã³ï¼
input[type="submit"]
ï¼ - ãªã»ãããã¿ã³ï¼
input[type="reset"]
ï¼ - ç»åãã¿ã³ï¼
input[type="image"]
ï¼ - æ±ç¨ãã¿ã³ï¼
input[type="button"]
ï¼ button
è¦ç´
11è¡ç®ã® expect(page).not_to have_css('form#new_session')
ã¯ããã°ã¤ã³ãã©ã¼ã ã表示ããã¦ããªãã¨ãããã¨ã確èªãã¦ãã¾ããã¦ã¼ã¶ã¼èªè¨¼ã«æåããç´å¾ã«è¡¨ç¤ºããããã¼ã¸ã«ã¯ãã°ã¤ã³ãã©ã¼ã ã表示ããã¦ããªãã¯ãã§ãã
21-22è¡ã¯ããã°ã¤ã³å¤±ææã«ã¯ãã¦ã¼ã¶ã¼åã¾ãã¯ãã¹ã¯ã¼ããæ£ããããã¾ããããã¨ããè¦åã¡ãã»ã¼ã¸ã¨ã¨ãã«ãã°ã¤ã³ãã©ã¼ã ãå度表示ããããã¨ã確èªãã¦ãã¾ãã
ãã¹ããæ£ãã失æããã
ãã¹ããæ¸ããããã¢ããªã±ã¼ã·ã§ã³æ¬ä½ã®ã½ã¼ã¹ã³ã¼ãã«ã¯æãä»ããã«ãã¹ããå®è¡ãã¾ããããã§å¤§äºãªãã¨ã¯ããã¹ããæ£ãã失æãããã¨ã§ããã·ã³ã¿ãã¯ã¹ã¨ã©ã¼ã§ãã¹ããåããªãã£ããããã¹ããéã£ã¦ãã¾ã£ãããã¦ã¯ãã¡ã§ãããã¹ãã®ã³ã¼ãããã£ããè¦ç´ãã¾ãããã
ååã®ãã¹ãçµæã¯æ¬¡ã®ããã«åºãã¯ãã§ãï¼
Failures: 1) ãã°ã¤ã³ ã¦ã¼ã¶ã¼èªè¨¼æå Failure/Error: within('form#new_session') do Capybara::ElementNotFound: Unable to find css "form#new_session" # ./spec/features/login_and_logout_spec.rb:6:in `block (2 levels) in <top (required)>' 2) ãã°ã¤ã³ ã¦ã¼ã¶ã¼èªè¨¼å¤±æ Failure/Error: within('form#new_session') do Capybara::ElementNotFound: Unable to find css "form#new_session" # ./spec/features/login_and_logout_spec.rb:16:in `block (2 levels) in <top (required)>'
ã¾ã ãã°ã¤ã³ãã©ã¼ã ã®ããã® HTML ãã³ãã¬ã¼ããæ¸ãã¦ããªãã®ã§ããããããæ£ãã失æãã§ãã
èªè ã®çããã®ã¿ã¼ããã«ã§ã¯ããã¹ã失æã®å ±åé ãéï¼ããã°ã¤ã³ ã¦ã¼ã¶ã¼èªè¨¼å¤±æããå ï¼ã«ãªã£ã¦ããããããã¾ãããRSpec ã¯ã¨ã°ã¶ã³ãã«ãã©ã³ãã ãªé åºã§å®è¡ããã®ã§ãå ±åé ã¯æ¯åå¤ããã¾ãã
ãã°ã¤ã³ãã©ã¼ã ãç¨æãã
次ã«è¡ããã¨ã¯ã失æã®è§£æ¶ã§ããä»ã¯ form#new_session
ã¨ãã CSS ã»ã¬ã¯ã¿ã«åè´ããè¦ç´ ããªããã¨è¨ããã¦ãã¾ãããããç¨æãã¾ãããã
ã¾ã app/views/top/index.html.erb
ã次ã®ããã«ä¿®æ£ãã¾ãã
<h1>Top#index</h1> <p>Hello World!</p> <%= render 'login_form' %>
ããã¦ãæ°è¦ãã¡ã¤ã« app/views/top/_login_form.html.erb
ã次ã®ãããªå
容ã§ä½æãã¦ãã ããã
<%= form_tag '', id: 'new_session' do %> <div> <%= label_tag 'username', 'ã¦ã¼ã¶ã¼å' %> <%= text_field_tag 'username' %> </div> <div> <%= label_tag 'password', 'ãã¹ã¯ã¼ã' %> <%= password_field_tag 'password' %> </div> <div> <%= submit_tag 'ãã°ã¤ã³' %> </div> <% end %>
æ¬æ¥ form_tag
ã®ç¬¬1å¼æ°ã«ã¯ãã©ã¼ã ãã¼ã¿ã®éä¿¡å
URL ãæå®ãã¾ãããã¨ãããã空æåãæå®ãã¦ããã¾ãã
ãã®æ®µéã§ãã¹ãçµæã¯æ¬¡ã®ããã«ãªãã¾ãï¼
Failures: 1) ãã°ã¤ã³ ã¦ã¼ã¶ã¼èªè¨¼æå Failure/Error: click_button 'ãã°ã¤ã³' ActionController::RoutingError: No route matches [POST] "/" # ./spec/features/login_and_logout_spec.rb:9:in `block (3 levels) in <top (required)>' # ./spec/features/login_and_logout_spec.rb:6:in `block (2 levels) in <top (required)>' 2) ãã°ã¤ã³ ã¦ã¼ã¶ã¼èªè¨¼å¤±æ Failure/Error: click_button 'ãã°ã¤ã³' ActionController::RoutingError: No route matches [POST] "/" # ./spec/features/login_and_logout_spec.rb:19:in `block (3 levels) in <top (required)>' # ./spec/features/login_and_logout_spec.rb:16:in `block (2 levels) in <top (required)>'
ã¾ã ãã¹ãã¯éã£ã¦ãã¾ãããã失æããç®æãå°ãåé²ãã¾ããããã®ããã«ãTDD/BDD ã«ããã¦ã¯å¤±æã®åå ãä¸ã¤ãã¤è§£æ¶ãããã¨ã§éçºãé²ãã§ããã¾ãã
次åã¯
次åã¯ãã¦ã¼ã¶ã¼èªè¨¼ãè¡ãããã®ã¢ã¯ã·ã§ã³ãå®è£ ãã¾ããã§ã¯ãã¾ãã
è£éºï¼2013/10/14ï¼
ååã®è¨äºã®ãè£éºãã§æ¸ãããã¨ã®ç¹°ãè¿ãã«ãªãã¾ãããæ£è¦è¡¨ç¾ã§ä½¿ç¨ãã \p{Hiragana}
ããã³ \p{Katakana}
ã«ã¯é·é³ç¬¦ï¼é³å¼ãï¼ãå«ã¾ããªãã®ã§ãããã¼ãããããã¢ã¼ãã³ããååã¨ãã¦æå®ããã¨ããªãã¼ã·ã§ã³ã失æãã¦ãã¾ãã¾ãã
ãã®ç¹ãè¸ã¾ãã¦ãã¹ããæ¸ãç´ãã¨ã次ã®ããã«ãªãã¾ãï¼
require 'spec_helper' describe Customer do let(:customer) { FactoryGirl.build(:customer) } specify '妥å½ãªãªãã¸ã§ã¯ã' do expect(customer).to be_valid end %w{family_name given_name family_name_kana given_name_kana}.each do |column_name| specify "#{column_name} ã¯ç©ºã§ãã£ã¦ã¯ãªããªã" do customer[column_name] = '' expect(customer).not_to be_valid expect(customer.errors[column_name]).to be_present end specify "#{column_name} ã¯40æå以å " do customer[column_name] = 'ã¢' * 41 expect(customer).not_to be_valid expect(customer.errors[column_name]).to be_present end specify "#{column_name} ã«å«ã¾ããåè§ã«ãã¯å ¨è§ã«ãã«å¤æãã¦åãå ¥ãã" do customer[column_name] = 'アーï¾' expect(customer).to be_valid expect(customer[column_name]).to eq('ã¢ã¼ã³') end end %w{family_name given_name}.each do |column_name| specify "#{column_name} ã¯æ¼¢åãã²ããªããã«ã¿ã«ããå«ãã§ããã" do customer[column_name] = 'äºãã¢ã¼ã³' expect(customer).to be_valid end specify "#{column_name} ã¯æ¼¢åãã²ããªããã«ã¿ã«ã以å¤ã®æåãå«ã¾ãªã" do ['A', '1', '@'].each do |value| customer[column_name] = value expect(customer).not_to be_valid expect(customer.errors[column_name]).to be_present end end end %w{family_name_kana given_name_kana}.each do |column_name| specify "#{column_name} ã¯ã«ã¿ã«ããå«ãã§ããã" do customer[column_name] = 'ã¢ã¼ã³' expect(customer).to be_valid end specify "#{column_name} ã¯ã«ã¿ã«ã以å¤ã®æåãå«ã¾ãªã" do ['äº', 'A', '1', '@'].each do |value| customer[column_name] = value expect(customer).not_to be_valid expect(customer.errors[column_name]).to be_present end end specify "#{column_name} ã«å«ã¾ããã²ãããªã¯ã«ã¿ã«ãã«å¤æãã¦åãå ¥ãã" do customer[column_name] = 'ãã¼ã' expect(customer).to be_valid expect(customer[column_name]).to eq('ã¢ã¼ã³') end end end
ããã¦ãapp/models/customer.rb
ã®ã³ã¼ãã¯æ¬¡ã®ããã«ãªãã¾ãï¼
require 'nkf' class Customer < ActiveRecord::Base validates :family_name, :given_name, :family_name_kana, :given_name_kana, presence: true, length: { maximum: 40 } validates :family_name, :given_name, format: { with: /\A[\p{Han}\p{Hiragana}\p{Katakana}\u30fc]+\z/, allow_blank: true } validates :family_name_kana, :given_name_kana, format: { with: /\A[\p{Katakana}\u30fc]+\z/, allow_blank: true } before_validation do self.family_name = NKF.nkf('-w', family_name) if family_name self.given_name = NKF.nkf('-w', given_name) if given_name self.family_name_kana = NKF.nkf('-wh2', family_name_kana) if family_name_kana self.given_name_kana = NKF.nkf('-wh2', given_name_kana) if given_name_kana end end
以ä¸ãè¨æ£ããã¦ããã ãã¾ãã
[æ´æ°] 失æã®å ±åé ãã©ã³ãã ã«å¤ãããã¨ã«ã¤ãã¦ã®æ³¨éã追å ãã¾ããã(2013/09/01)
[æ´æ°] èªè
ã®æ¹ããã®ãææã«ããããã°ã¤ã³ãã©ã¼ã ã®é¨åãã³ãã¬ã¼ãï¼ãã¼ã·ã£ã«ï¼ã®ãã¡ã¤ã«åã _form.html.erb
ãã _login_form.html.er
ã«è¨æ£ãã¾ããã(2013/09/08)
[æ´æ°] é·é³ç¬¦ãå«ãååã®ããªãã¼ã·ã§ã³ã«é¢ããè£éºã追å ãã¾ããã(2013/10/14)
[æ´æ°] èªè
ã®æ¹ããã®ãææã«ãããHTMLãã³ãã¬ã¼ãã®ãã¹ã app/top/index.html.erb
ãã app/views/top/index.html.erb
ã«ãapp/top/_login_form.html.erb
ãã app/views/top/_login_form.html.erb
ã«è¨æ£ãã¾ããã(2013/11/01)