-
Notifications
You must be signed in to change notification settings - Fork 3
Ajax on rails.textile
์ด ์๋ด์๋ ๋ ์ผ์ค์ ๋ด์ฅ๋์ด ์๋ Ajax/JavsScript ๊ธฐ๋ฅ์ฑ์ ๋ค๋ฃจ๊ณ ์์ด์ ๋ค์ํ๊ณ ๋์ ์ธ AJAX ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ๋ง๋ค์ ์๊ฒ ํด ์ค ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ๋ค๋ฃฐ ์ฃผ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- AJAX์ ๊ด๋ จ๋ ๊ธฐ์ ๋ค์ ๋ํ ๊ฐ๋ตํ ์๊ฐ
- ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ ์ผ์ค๋ฐฉ์์ผ๋ก ๋ค๋ฃจ๊ธฐ: Rails helpers, RJS, Prototype and script.aculo.us
- ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ ํ ์คํธํ๊ธฐ
endprologue.
โshow me the codeโํ์ ์ฌ๋์ด๋ผ๋ฉด ์ด ๋ถ๋ถ์ ๊ฑด๋๋ ๊ณ RJS ๋ถ๋ถ์ผ๋ก ์ด๋ํ๊ณ ์ถ์ด ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋, ์ด ๋ถ๋ถ์ ์ฝ์ด ๋ณผ ๊ฒ์ ์ ๋ง๋ก ๊ถํ๋๋ฐ, ๋ ์ผ์ค์์ Ajax๋ฅผ ์ ์ดํดํ๋ ค๋ฉด ์ฌ๊ธฐ์ ์ธ๊ธ๋๋ DOM์ ๊ธฐ๋ณธ๊ฐ๋ , http ์์ฒญํ๋ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ๊ธฐํ ๋ค๋ฅธ ํ ํฝ๋ค์ด ํ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
(= Asynchronous JavaScript and XML)
Ajax์ ๊ธฐ๋ณธ ์ฉ์ด์ค๋ช , ์น์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ์๋ก์ด ๋ฐฉ์
DOM ์ ๊ธฐ๋ณธ๊ฐ๋ , DOM ์ด ๋ง๋ค์ด์ง ๋ฐฉ๋ฒ, DOM ์ ์์ฑ, ํน์ง, DOM ์ด AJAX ์ ํต์ฌ์ธ ์ด์
ํต์์ ์ธ ์์ฒญ๊ณผ AJAX์์ฒญ์ ์ฐจ์ด์ , ๋ ์ผ์ค์์ AJAX ๋ฅผ ์ดํดํ๋๋ฐ ์์ด์์ ์ด๋ฌํ ์ฐจ์ด์ ์ ์ค์์ฑ(๋ค์ ์น์ ์ ์ธ๊ธ๋๋ *_remote ํฌํผ๋ฉ์๋์ ์ฐ๊ด๋จ)
๋ ์ผ์ค์ ๊ธฐ๋ณธ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ๋ Prototype ์ ๋๋ค. Prototype ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ๋ก์ DOM ๊ฐ์ฒด ์กฐ์๊ณผ AJAX ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ทธ์ธ์๋ ์ ํธ๋ฆฌํฐ ํจ์๋ก๋ถํฐ ๊ฐ์ฒด์งํฅ์ ๊ตฌ์กฐ์ ์ด๋ฅด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ ์ ๊ณตํด ์ค์ผ๋ก์จ ๋์ ์ธ ์น์ดํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ก ํ๊ธฐ ์ํด ๋ง๋ค์ด ์ก์ต๋๋ค. Prototype ์ ํน์ ์ธ์ด๋ฅผ ์ํด์ ๋ง๋ค์ด์ง ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์, ์ด์ ๊ด๋ จ๋ ๋ค์์ ํฌํผ๋ฉ์๋๋ฅผ ๋ ์ผ์ค๊ฐ ์ ๊ณตํด์ Prototype์ด ๋ ์ผ์ค ๋ทฐ ํ์ผ๋ค๊ณผ ๋งค๋๋ฝ๊ฒ ํตํฉ๋ ์ ์๋๋ก ํด์ค๋๋ค.
์ด๋ฌํ ํฌํผ๋ฉ์๋์ ์ ๊ทผํ๊ธฐ ์ํด์ ํด์ผ ํ ๊ฒ์ ๋๊ฐ๋ application.html.erb์ ๊ฐ์ ์น์ดํ๋ฆฌ์ผ์ด์
์ ์ต์์ ๋ ์ด์์ ํ์ผ์ Prototype ํ๋ ์์ํฌ๋ฅผ ์๋์ ๊ฐ์ด ํฌํจ์ํค๋ ๊ฒ์
๋๋ค.
javascript_include_tag โprototypeโ
์ด์ ๋ ์ผ์ค ์ดํ๋ฆฌ์ผ์ด์ ์ AJAX์ ๋ํ ์ฌ๋์ ๋ํด ์ค ์ค๋น๊ฐ ๋ ๊ฒ์ ๋๋ค.
์๋ง๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ํฌํผ๋ฉ์๋์ธ link_to_remote ๋ก๋ถํฐ ์์ํด ๋ด ์๋ค. ๊ด๋ จ ๋ํ๋จผํธ์ ๊ธฐ๋ก๋ ๊ฒ์ ๋ณผ ๋ ์ด ํฌํผ๋ฉ์๋๋ ์ฌ๋ฏธ์๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋๋ฐ, ์ด ํฌํผ๋ฉ์๋๋ก ๋๊ฒจ์ง๋ ์ต์ ๋ค์ ๋ชจ๋ AJAX ํฌํผ๋ฉ์๋๋ค์์๋ ๊ณต์ ํ๊ฒ ๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ด ํฌํผ๋ฉ์๋์ ์ต์ ๊ณผ ์๋ ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ฒ ๋๋ฉด ๋ค๋ฅธ ํฌํผ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
link_to_remote ํจ์๋ ํ์ค link_to ํฌํผ๋ฉ์๋์ ๊ทธ ํน์ง์ด ๊ฐ์ต๋๋ค. :
def link_to_remote(name, options = {}, html_options = nil)
๊ทธ๋ฆฌ๊ณ ์๋์ link_to_remote ํฌํผ๋ฉ์๋์ ๋ํ ๊ฐ๋จํ ์์ ๊ฐ ์์ต๋๋ค.
link_to_remote โAdd to cartโ,
:url => add_to_cart_url(product.id),
:update => โcartโ
- ์ ์ผ ์ฒ์์ ์๋ ๋งค๊ฐ๋ณ์๋ ๋ฌธ์์ด์ธ๋ฐ, ์นํ์ด์ง์ ๋ํ๋๋ ๋งํฌ์ ํ ์คํธ์ ๋๋ค.
- ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ options ํด์ฌ์ด๋ฉฐ, AJAX์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ ๊ฐ์ฅ ์ฌ๋ฏธ์๋ ๋ถ๋ถ์
๋๋ค.
- :url ์ด๊ฒ์ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฆฌ๋ชจ๋ ๋งํฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ฐ๋์ ํ์ํ ๋งค๊ฐ๋ณ์์ ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก๋, :url ๋งค๊ฐ๋ณ์ ์์ด ๋น ํด์ฌ๋ฅผ ๋๊ธธ ์ ์์ง๋ง, ์ด๋ฐ ๊ฒฝ์ฐ์๋ ํ๋ก๊ทธ๋๋จธ์ ์๋์๋ ์๊ด์์ด POST ์์ฒญ์์ ์ฌ์ฉ๋๋ ์ฃผ์๊ฐ ํ์ฌ์ ์ฃผ์๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ด URl ์ฃผ์์๋ AJAX ์ก์ ํธ๋ค๋ฌ์ ์์น๋ฅผ ์ง์ ํด ์ค๋๋ค. ๋๊ฐ ์ด URL์๋ ๋ ์ผ์คREST ๋ทฐ ํฌํผ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ง์ ํ๊ฒ ๋์ง๋ง, url_for ํํ๋ก ์ง์ ํ ์๋ ์์ต๋๋ค.
- :update ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ๋ก๋ถํฐ์ ์๋ต์ ์นํ์ด์ง์์ ๋ณด์ฌ์ง๊ธฐ ํ๋๋ฐ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ํ๋๋ RJS์ ๊ด๋ จ๋ ์ฌํญํ๊ณ ์ด๊ฒ์ ๋ค์ ์ฅ์์ ์ธ๊ธํ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ํ๋๋ ์ ๋ฐ์ดํธํ๊ณ ์๋ ํ๋ ์๋ฆฌ๋จผํธ์ DOM ์์ด๋ ๊ฐ์ ์ง์ ํ๋ ๊ฒ์ ๋๋ค. ์์ ์์ ์์๋ ์ด๊ฒ์ ๋ํ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์๊ฐํ์ง๋ง, ์๋ฒ๊ฐ ์นํ์ด์ง์ ํ์๋ ์๋ฌ ๋ฉ์์ง๋ก ์๋ต์ ํ ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ์ผ์ค๋ ์ด๋ฌํ ์ํฉ์ ๋ํ ํด๊ฒฐ๋ฐฉ๋ฒ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
link_to_remote โAdd to cartโ,
:url => add_to_cart_url(product),
:update => { :success => โcartโ, :failure => โerrorโ }
์๋ฒ๊ฐ 200๋ฒ์ผ๋ก ์๋ตํ ๋ ์์ ์์ ๋ ์ด์ ์ ๊ฐ๋จํ ์์ ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ ์ค ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋, ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ โcartโ ์๋ฆฌ๋จผํธ๊ฐ ์๋๋ผ โerrorโ ์์ด๋๋ฅผ ๊ฐ์ง๋ DOM ์๋ฆฌ๋จผํธ๊ฐ ์ ๋ฐ์ดํธ ๋ฉ๋๋ค.
-
position : ๊ธฐ๋ณธ์ ์ผ๋ก(์ด์ ์์ ์ ๊ฐ์ด ์ด ์ต์
์ ๋ช
์ํ์ง ์์ ๋), ์๋ฒ๋ก๋ถํฐ์ ์๋ต์ ๋ช
์๋ DOM ์์ด๋๋ฅผ ๊ฐ์ง ์๋ฆฌ๋จผํธ์ ํ์๋์ด ์ด์ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ด๋ฅผ ๋์ฒดํ๊ฒ ๋ฉ๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํด๋น ์๋ฆฌ๋จผํธ์ ์๋์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์๋๋ก ์ด๋ฌํ ๋์์ ๋ณ๊ฒฝํ๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์๋ก์ด ๊ฐ์ ์ด๋์ ๋ ๊ฒ์ด๋ ์
๋๋ค. ๋ฐ๋ก ์ด๋ position ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํด์ ์์น๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ, 4๊ฐ์ง ์ต์
์ ๊ฐ์ง ์ ์์ต๋๋ค.
- :before : ์๋ฒ์๋ต ๋ด์ฉ์ ๋์ ์๋ฆฌ๋จผํธ ์ง์ ์ ์ฝ์ ํฉ๋๋ค. ๋ ์ ํํ๊ฒ ๋งํ๋ฉด, ์๋ฒ์๋ต์ผ๋ก๋ถํฐ ํ ์คํธ ๋ ธ๋๋ฅผ ๋ง๋ค์ด์ ๋์ ์๋ฆฌ๋จผํธ์ ์ง์ ํ์ ๋ ธ๋๋ก ์ฝ์ ํฉ๋๋ค.
- :after : :before ์ ๋น์ทํ ๋์์ ํฉ๋๋ค๋ง, ์ด ๊ฒฝ์ฐ์๋ ๋์ ์๋ฆฌ๋จผํธ ์ดํ์ ์๋ฒ์๋ต์ด ์ฝ์ ๋ฉ๋๋ค.
- :top : ํ ์คํธ๋ฅผ ์๋ณธ ๋ด์ฉ ์ด์ ์ ์๋ ๋์ ์๋ฆฌ๋จผํธ๋ก ์ฝ์ ํฉ๋๋ค. ๋์ ์๋ฆฌ๋จผํธ๊ฐ ๋น์ด ์๋ ๊ฒฝ์ฐ์๋ :position ๊ฐ์ ์ ํ ์ค์ ํ์ง ์์ ์ํ์ ๋์ผํ๊ฒ ๋ฉ๋๋ค.
- :bottom : :top ์ ๋ฐ๋ ์ต์ ์ผ๋ก ์๋ฒ์๋ต์ด ๋์ ์๋ฆฌ๋จผํธ์ ์๋ณธ ๋ด์ฉ ๋ค์์ ์ฝ์ ๋ฉ๋๋ค.
:bottom ์ต์ ์ ์ด์ฉํ๋ ์ ํ์ ์ธ ์๋ ๊ธฐ์กด ๋ชฉ๋ก์ <li> ์๋ฆฌ๋จผํธ๋ฅผ ์๋ก ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
link_to_remote โAdd new itemโ,
:url => items_url,
:update => โitem_listโ,
:position => :bottom
- :method : ๋ทฐ ํ ๋ธ๋ฆฟ์ ์๊ฒฉ ๋งํฌ๋ฅผ ์ถ๊ฐํ ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก POST ์์ฒญ์ ํ๊ฒ ๋์ด ์ด๊ฒ์ด ๋ํดํธ ๋์์ด ๋๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํน์ ๋ด์ฉ์ ์ ๋ฐ์ดํธ(PUT)ํ๊ฑฐ๋ ์ญ์ (DELETE)ํ๊ณ ์ ํ ๋ :method ์ต์ ์ ์ด์ฉํ์ฌ ๋ช ์ํ ์ ์์ต๋๋ค. ํน์ ๋ชฉ๋ก์์ ํ๋์ ํญ๋ชฉ์ ์ญ์ ํ๊ธฐ ์ํ ์ ํ์ ์ธ AJAX ๋งํฌ์ ๋ํ ์๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
link_to_remote โDelete the itemโ,
:url => item_url(item),
:method => :delete
์ฃผ์ํ ๊ฒ์, ๋ํดํธ ๋์(POST)์ ๋ณ๊ฒฝํ์ง ์์ ๊ฒฝ์ฐ ์์ ์ฝ๋๋ ์ญ์ ๋ณด๋ค๋ ์์ฑ(create) ๋์์ผ๋ก ์๋ํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
-
JavaScript filters : ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ๊ฐ์ธ๊ฒ ๋๋ฉด ์๊ฒฉ ํธ์ถ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด์ ์์ ์์, ํน์ ๋งํฌ๋ฅผ ์์ ๊ณ ์ ํ ๋, ์ ์ ์๊ฒ ๊ฐ๋จํ ํ
์คํธ ๋ฐ์ค๋ฅผ ๋ณด์ฌ์ฃผ์ด ํ์ธ์ ์๊ตฌํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ ํ์ ์ธ ์๋ก์ ์ด ์ต์
์ ์ด์ฉํ์ฌ ์ํํ ์ ์์ต๋๋ค. ํ๋์ฉ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- :confirm => msg : ์๋ฐ์คํฌ๋ฆฝํธ ํ์ธ ๋ํ์ฐฝ์ ๋์ msg ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ ์ ๊ฐ โOKโ๋ฅผ ์ ํํ๋ฉด ์์ฒญ ์์ ์ด ์งํ๋๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ทจ์๋ฉ๋๋ค.
- :condition => code : ๋ ผ๋ฆฌ๊ฐ์ ๋ฐํํ๋ code ๋ฅผ ์คํดํ์ฌ ์ฐธ์ด๋ฉด ์์ ์ ์งํํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ทจ์ํฉ๋๋ค.
- :before => code : ์์ฒญ์ ์งํํ๊ธฐ ์ง์ ์ code ๋ฅผ ์คํํฉ๋๋ค. ํด๋น ์ฝ๋์ ๊ฒฐ๊ณผ๋ ํธ์ถ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ์งํ์ํฉ์ ํ์ํ๊ธฐ ์ํด์ ํํ ์ฌ์ฉ๋๋ฉฐ ๋ค์ ์์ ์์ ์ด๋ฌํ ๋์์ ์ ์ ์์ต๋๋ค.
- :after => code : ์์ฒญ์ ์คํํ ํ์ code ๋ฅผ ํ๊ฐํ๊ฒ ๋ฉ๋๋ค. ๋ค์ ์น์ ์์ ๋ค๋ฃจ๊ฒ ๋๊ฒ ์ง๋ง ์ด๊ฒ์ :success ๋ :complet ์ฝ๋ฐฑ๊ณผ๋ ๋ค๋ฆ ๋๋ค. ์ด๊ฒ๋ค์ ์์ฒญ์ด ์๋ฃ๋ ํ์ ์คํ๋์ง๋ง, :after ๋ก ๋๊ฒจ์ง๋ ์ฝ๋๋ ์๊ฒฉ ํธ์ถ ๋ ์งํ์ ์คํ๋๋ค๋ ๊ฒ์ ์ฃผ๋ชฉํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์๋ฅผ ๋ค๋ฉด ์นํ์ด์ง์ ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ๊ฑฐ๋ ์์ฒญ์ด ์๋ฃ๋๋ ์์ ์์ ๋์ด์ ๋์์ ํ์ง ๋ชปํ๋๋ก ํ ๊ฒฝ์ฐ์ ๋๋ค.
- :submit => dom_id : ์ด ์ต์ ์ link_to_remote ํฌํผ๋ฉ์๋์ ํด๋น๋์ง ์์ง๋ง ๋ชจ๋ ๊ฒ์ ์ธ๊ธํ๋ค๋ ์๋ฏธ์์ ์ฌ๊ธฐ์ ๋ค๋ฃจ๊ธฐ๋ก ํ๊ฒ ์ต๋๋ค. ๋ํดํธ๋ก, ์ ์ ๊ฐ ์๋ฐํ๋ ํผ ์๋ฆฌ๋จผํธ์ ์์ ์๋ฆฌ๋จผํธ๋ ํ์ฌ์ ํผ์ด ๋ฉ๋๋ค. ์ด ๋ ๋ํดํธ ๋์์ ๋ณ๊ฒฝํ๊ณ ์ ํ ๋ ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์ด ์ต์ ์ ์ง์ ํ๊ฒ ๋๋ฉด, DOM ์์ด๋๊ฐ dom_id ์ ์ง์ ํด์ ์์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋ฉ๋๋ค.
- :with > code : code ๊ฐ ์์ ํ ๋น๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ํ๊ฐ๋ ํ ์์ฒญ๋ URL์ ๋งค๊ฐ๋ณ์(๋ค)๋ก ์ถ๊ฐ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก code ๊ฐ์ ์ ํจํ URL ์ฟผ๋ฆฌ๋ฌธ์์ด์ ๋ฐํํ๊ฒ ๋ฉ๋๋ค(like โitem_type=8โ or โitem_type=8&sort=trueโ). ๋๊ฐ๋ ์นํ์ด์์์ ๊ฐ๋ค์ ์ป๊ฒ ๋ฉ๋๋ค. ์ ์์ ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
link_to_remote โUpdate recordโ,
:url => record_url(record),
:method => :put,
:with => โโstatus=โ + โencodeURIComponent(
์ด ์ฝ๋๋ ์นํ์ด์ง๋ด์ โstatusโ์ โcompeletedโ DOM ์์ด๋๋ฅผ ๊ฐ์ง๋ ์๋ฆฌ๋จผํธ๋ก๋ถํฐ ๊ฐ์ ธ ์จ 2๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ ์ผ์ค๊ฐ ๋ง๋ค์ด ์ฃผ๋ ํ์ค URL์ ์ถ๊ฐํ์ฌ ์๊ฒฉ ๋งํฌ๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
-
Callbacks : AJAX ํธ์ถ์ ๋ณดํต ๋น๋๊ธฐํ ๋์ด ์ผ์ด๋์ง๋ง, ๊ทธ ์ด๋ฆ์ด ์์ํ๋ ๋ฐ์ ๊ฐ์ด (๋ฐ๋์ ๊ทธ๋ฐ ๊ฒ์ ์๋์ง๋ง, ๋ง์ง๋ง ์ต์
์ธ :type ์ ์ค์ ํ์ฌ ์์ฒญ์ ๋๊ธฐํํ ์ ์์ต๋๋ค) ํน์ ์์ฒญ์ด ์์๋ ํ ํด๋น ์์ฒญ๊ณผ ํต์ ํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ฝ๋ฐฑ์ ์ง์ ํ๋ ๊ฒ์
๋๋ค. ์ฌ๋์ ๋ฐ๋ผ 6๊ฐ์ ์ต์
์ ์์ ์ ์์ต๋๋ค(๋ชจ๋ ๊ฐ๋ฅ์ฑ ์๋ ์๋ต ํํ๋ฅผ ๊ณ์ฐํด ๋ณด๋ฉด 508๊ฐ๋ ๋์ง๋ง ์ธ๊ธํ 6๊ฐ๋ง์ด ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ๋์ด ์์๋ก ์ ์ํ๊ฒ ๋์์ต๋๋ค).
- :loading: => code : ์์ฒญ์ด ๋ฐ์ดํ๋ฅผ ๋ฐ๋ ์ค์ ์์ง๋ง ์๋ฃ๋์ง ์์ ์ํ์ ๋๋ค.
- :loaded: => code : ์์ฒญ์ผ๋ก๋ถํฐ ๋ฐ์ดํ ์ด๋์ด ์๋ฃ๋์์ง๋ง ์์ง ์ฒ๋ฆฌ๋์ง ๋ชปํ์ฌ ๋ฐํ๋์ง ์์ ์ํ์ ๋๋ค.
- :interactive: => code : :loaded ์งํ ๋จ๊ณ๋ก์ ๋ฐ์ดํ ์ด๋์ด ์๋ฃ๋์ด ์ฒ๋ฆฌ๋ ์ํ์ ๋๋ค.
- :success: => code : ์๋ฒ๋ก ๋ฐ์ดํ ์ด๋์ด ์๋ฃ๋์ด ์ฒ๋ฆฌ๋ ํ์ โ200 OKโ ์๋ต์ ๋ณด๋ธ ์ํ์ ๋๋ค.
- :failure: => code : ์๋ฒ๋ก ๋ฐ์ดํ ์ด๋์ด ์๋ฃ๋์ด ์น๋ฆฌ๋ ํ์ โ200 OKโ ์ธ์ ๊ฐ์ผ๋ก ์๋ต์ ๋ณด๋ธ ์ํ์ ๋๋ค.(๋๊ฐ๋ 404 ๋๋ 500 ๊ฐ์ด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก 100์์ 509๊น์ง์ ์ํ ์ฝ๋๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค)
- :complete: => code : ์ด์ ๋๊ฐ์ ์ต์ ์ ํฉํ ์ํ์ ๋๋ค. ์ฆ, ์์ฒญ์ด ์๋ฃ๋์ด ๋ฐ์ดํ๊ฐ ๋ถ์๋๊ณ ์ํ ์ฝ๋๊ฐ์ ๋ฐํํ ์ํ์ ๋๋ค(์ํ ์ฝ๋๊ฐ์ ์ด๋ ํ ๊ฐ์ด์ด๋ ๋ฉ๋๋ค).
- ๊ธฐํ ๋ค๋ฅธ ์ํ ์ฝ๋๊ฐ(100-509) : 404 ์ ๊ฐ์ ๊ธฐํ HTTP ์ํ ์ฝ๋๊ฐ์ ์ ๊ฒํ ๊ฒฝ์ฐ์๋ ์ํ ์ฝ๋๊ฐ์ ์ซ์๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
link_to_remote โAdd new itemโ,
:url => items_url,
:update => โitem_listโ,
404 => โalert(โItem not found!โ)โ
๊ฐ์ฅ ์์ฃผ ์ฌ์ฉํ๋ ์ฝ๋ฐฑ์ธ :success, :failure, :complete ๊ฐ ๋์ํ๋ ์ ํ์ ์ธ ์์ ๋ฅผ ๋ด ์๋ค.
link_to_remote โAdd new itemโ,
:url => items_url,
:update => โitem_listโ,
:before => โ$(โprogressโ).show()โ,
:complete => โ$(โprogressโ).hide()โ,
:success => โdisplay_item_added(request)โ,
:failure => โdisplay_error(request)โ
- :type : ์ด๋ค ๋ถ๋ช ์น ์์ ์ด์ ๋ก ํด์ ์์ฒญ์ ๋๊ธฐํํ๊ณ ์ถ์ ๋(์์ฒญ์ด ์ฒ๋ฆฌ๋๊ณ ์ํ ๊ฐ์ ๋ฐํํ์ง ์์ ์ํ์์ ๋ธ๋ผ์ฐ์ ธ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ผ ํ๋ ๊ฒฝ์ฐ) ์ด ์ต์ ์ :synchronous ๋ก ์ค์ ํด์ ์ด์ฉํ ์ ์์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก html_options ๋งค๊ฐ๋ณ์๋ฅผ ์ด์ฉํด์, ์ต์ข
์ ์ผ๋ก ๋ง๋ค์ด์ง๋ ํ๊ทธ์ HTML ์์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๊ฒ์ link_to ํฌํผ๋ฉ์๋์ ๋์ผํ ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ๋์์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ href ์ onclick ๋งค๊ฐ๋ณ์์ ๋ํด์๋ ์ฌ๋ฏธ์๋ ๋ถ๋ํจ๊ณผ๊ฐ ์์ต๋๋ค.
- href ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ ๋ธ๋ผ์ฐ์ ธ์์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋ํ์ง ์๋๋ผ๋ AJAX ๋งํฌ๊ฐ ๋ฉ์ง๊ฒ ๊นจ์ง๋ฉด์ ๋งํฌ๋ ์ง์ ํ ์ฃผ์๋ก ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค.
- link_to_remote ๋ ๋งํฌ์ onclick ํธ๋ค๋ฌ์ ์๊ฒฉ ์ฝ์ ์ง์ ํด ๋๊ฒ ๋๋ฉด AJAX ๋์์ ํ๊ฒ ๋ฉ๋๋ค. html_options[:onclick] ์ ์ค์ ํ๋ฉด ๋ํดํธ ๋์์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฏ๋ก ์ฃผ์๋ฅผ ๊ธฐ์ธ๋ ค์ผ ํฉ๋๋ค.
์ด์ link_to_remote ๋ํ ์ค๋ช ์ ๋ง์นฉ๋๋ค. ํ๋์ ํฌํผํจ์์ ๋ํด์ ์ํํ๊ธฐ์๋ ๋ง์ ์์ด์ง๋ง ๊ธฐ์ตํ ๊ฒ์ ์ด ์ต์ ๋ค์ ๋ ์ผ์ค ๋ทฐ ํฌํผ๋ฉ์๋ค์ ๋ํด์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉํ ์ ์์ด์ ๋ค์ ์น์ ์์ ์ฐจ์ด์ ๊ณผ ์ถ๊ฐ๋ ๋งค๊ฐ๋ณ์๋ค์ ๋ํด์ ์์ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Prototype ํฌํผ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๋ทฐํ ํ๋ฆฟ์ AJAX ํผ์ ์ถ๊ฐํ๋๋ฐ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ฝ๊ฐ์ฉ์ ์ฐจ์ด์ ์ด ์์ง๋ง ๊ฒฐ๊ตญ์ ๊ฐ์ ๋ชฉ์ ์ ์ํ ๊ฒ์ ๋๋ค. ์ฆ, ํ์ค HTTP ์์ฒญ/์๋ต ์ฃผ๊ธฐ๋ฅผ ์ด์ฉํด์ ์๋ฐ(submit)ํ๋ ๋์ ์, ์นํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ฉํ์ง ์๊ณ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ฐํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- remote_form_for (and itโs alias form_remote_for) ๋ ๋งค๊ฐ๋ณ์๋ก์ ํ๋์ ๋ฆฌ์์ค, ์ฆ, ๋ชจ๋ธ์ด๋ ๋ฆฌ์์ค๋ฐฐ์ด(์ค์ฒฉ๋ฆฌ์์ค)์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ 3๊ฐ์ง ๋ฐฉ๋ฒ ์ค์ ๊ฐ์ฅ ๋ฐ์ ํ๊ฒ ๋ ์ผ์ค์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
- form_remote_tag ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํผ ๋ฐ์ดํฐ๋ฅผ ์๋ฆฌ์ผ๋ก ๋ณด๋์ผ๋ก์์จ ํผ์ AJAXํ ํฉ๋๋ค.
- submit_to_remote ์ button_to_remote ๋ ์ด์ ๋๊ฐ์ ๋ฐฉ๋ฒ๋ณด๋ค๋ ๋ ์์ฃผ ์ฌ์ฉ๋์ง๋ ์์ต๋๋ค. AJAX ํผ์ ๋ง๋ค๊ธฐ๋ณด๋ค๋ ๋ฒํผ์ด๋ input ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํด ์ค๋๋ค.
์๋๋๋ ๊ฒ์ ํ๋์ฉ ์์ ๋ณด๋๋ก ํฉ์๋ค!
h4(#). ์๋ฆฌ๋จผํธ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๊ธฐ
์ง๋ ์น์ ์์, ์๋ฒ์ ๋ช๊ฐ์ง AJAX ์์ฒญ์ ๋ณด๋ด๊ณ ( :update ์ต์ ์ ์ด์ฉํด์) ์นํ์ด์ง์ HTML์๋ต์ ์ฝ์ ํ ๋ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋, ๋๋ก๋ ์ข ๋ ๋ณต์กํ ๋์์ ์นํ์ด์ง์ ์ ์ฉํด์ผ ํ ๊ฒฝ์ฐ๊ฐ ํ์ํ๋ฐ, ๋ฐ๋ก ์ด๋ฐ ๊ฒฝ์ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ RJS๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋์์ ์๋ฒ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๋ช ๋ น์ ๋ณด๋ด๊ฒ ๋๋๋ฐ, ์ ์์ ๊ฒฝ์ฐ์๋ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ, ํ์์ ๊ฒฝ์ฐ๋ ๋ ์ผ์ค๋ก ์ฝ๋ฉ์ ํ๊ณ ์ ์ ๋ ์ผ์ค๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ฉ๋๋ค. ๊ทธ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก RJS๊ฐ ๋ฃจ๋น DSL์ด์ด์ ๋ ์ผ์ค ์ฝ๋๋ด์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ฝ์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋จผ์ ์๋ฒ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์๋์ผ๋ก ๋ณด๋ด๋ ๋ฐฉ๋ฐฅ์ ์์๋ณผ ๊ฒ์ ๋๋ค. ์ค์ ๋ก๋ ์ด๋ฐ ๊ฒฝ์ฐ๋ ์๊ฒ ์ง๋ง ์ด๋ค ์ํฉ์ด ์ผ์ด๋๊ณ ์๋์ง๋ฅผ ์ด์ ํด ๋๋ ๊ฒ์ ์ฌ๋ฏธ์๋ ์ผ์ ๋๋ค.
def javascript_test
render :text => โalert(โHello, world!โ)โ,
:content_type => โtext/javascriptโ
end
(์ฃผ์: ๋ฐ๋ก ์์ ๋ฉ์๋๋ฅผ ์ ๊ฒํ๊ธฐ ์ํด์๋, javascript_test ์ก์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ :url ์ต์ ์ ์ค์ ํด์ link_to_remote ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.)
์์ ๋ฉ์๋์์๋ ํค๋๋ณ์์ธ Content-Type์ ์ง์ ํด์ ๋ธ๋ผ์ฐ์ ธ๊ฐ ์ ์ก๋๋ ํ ์คํธ๋ฅผ ๋จ์ํ ํ ์คํธ๋ก ๋ณด์ง ์ฃผ์ง ์๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ๋ํดํธ ๋์์ ํ๋๋ก ์ง์ํ๊ฒ ๋ฉ๋๋ค.
์ธ๊ธํ๋ ๋ฐ์ ๊ฐ์ด, RJS์ ๋ชฉ์ ์ ๋ ์ผ์ค๊ฐ ์๋์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํ์์ผ์ฃผ๋ ๋ฃจ๋น ์ฝ๋ฉ์ ํ๋ ๊ฒ์ ๋๋ค. ์์ ์์ ๋ ๋๋ฌด ๋ฃจ๋น์์ด ์๋๋ผ์ ๋ ์ผ์ค์์ผ๋ก ์ด๋ป๊ฒ ์ฝ๋ฉํ๋ ์์ ๋ณด๊ฒ ์ต๋๋ค.
def javascript_test
render :update do |page|
page.alert โHello from inline RJSโ
end
end
์์ ์ฝ๋ ๋ถ๋ถ์ ์ด์ ์น์ ์ ๊ฒ๊ณผ ์ ํํ ๋์ผํ์ง๋ง ํจ์ฌ ์ฐ์ํ๊ฒ ์ฝ๋ฉํ ๊ฒ์ ๋๋ค. ํค๋๋ถ๋ถ์ ๋ํด์ ๊ฑฑ์ ํ ํ์์์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ฌธ์์ด๋ก ๋ฃ์ ํ์๊ฐ ์์ต๋๋ค. render ์ ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๊ฐ :update ์ผ ๊ฒฝ์ฐ, ๋ ์ผ์ค๋ ๋ธ๋ก์์ ํ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ํ์๋ก ํฉ๋๋ค. ์ฌ๊ธฐ์๋ page ๊ฐ ์ด์ ํด๋น๋๋ฉฐ ์ ํต์ ์ธ ๋ช ๋ช ๊ท์น์ ๋ฐ๋ฅด๋ฉฐ JavaScriptGenerator ๊ฐ์ฒด์ ์ธ์คํด์ค์ ๋๋ค. ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด, JavaScriptGenerator๋ ๋ก๋น ์ฝ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ง๋ค์ด ๋ ๋๋ค. page ์ธ์คํด์ค์ ๋ํด์ ๋ฉ์๋ ํธ์ถ์ ์ฌ๋ฌ๋ฒ ํ ์ ์์ต๋๋ค. ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํ๋์ด ์ ์ ํ Content Type, ์ฆ, โtext/javascriptโํํ๋ก์จ ์๋ฒ๋ก ๋ณด๋ด์ง๊ฒ ๋ฉ๋๋ค.
์ธ๋ผ์ธ RJS๊ฐ ํ์ค ์ด์์ธ ๊ฒฝ์ฐ์ ๊ฐ์ด ์ปจํธ๋กค๋ฌ๊ฐ ๋ทฐ ์ฝ๋๋ก ๋์ ๋ถํด์ง๊ธฐ๋ฅผ ์์น ์๋๋ค๋ฉด, RJS ์ฝ๋๋ฅผ ๋ทฐ ํ ํ๋ฆฟ ํ์ผ๋ก ์ฎ๊ธธ ์ ์์ต๋๋ค. ์ด ๋ RJS ํ ํ๋ฆฟ์ /app/views/ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํด์ผ ํ๋ฉฐ, ํด๋น ์ปจํธ๋กค๋ฌ์ .html.erb ์ด๋ ๋ค๋ฅธ ๋ทฐ ํ์ผ ํํ, ๋๊ฐ๋ js.rjs ํ์ผ ํํ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
์์ ์์ ๋ฅผ ๋ค์ ์์ฑํ๋ฉด, ์ก์ ์ฝ๋๋ถ๋ถ์ ๋น์๋๊ณ javascript_test.js.rjs ๋ผ๋ ์ด๋ฆ์ผ๋ก RJS ํ ํ๋ฆฟ ํ์ผ์ ๋ง๋ค๊ณ ์๋์ ์ฝ๋๋ฅผ ํผํจ์์ผ ๋ก๋๋ค.
page.alert โHello from inline RJSโ
์ด ์น์ ์์๋ RJS๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์์ ๋ณด๊ฒ ์ต๋๋ค.
page JavascriptGenerator ์ธ์คํด์ค๋ฅผ ์ด์ฉํด์ ํ๋ฒ ์ฌ๋ฌ ๊ฐ์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ค๋ฃฐ ์ ์์ต๋๋ค. ์ค์ ์ฝ๋๋ฅผ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
page.show :div_one, :div_two
page.hide :div_one
page.remove :div_one, :div_two, :div_three
page.toggle :other_div
์์ ๋ฉ์๋(show, hide, remove, toggle)๋ Prototype๊ณผ ๋์ผํ ๋ฉ์๋์ ๋ฌธ๋ฒ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค. ์ด ๋ ์ ์ด๋ ํ๊ฐ ์ด์์ DOM ์์ด๋๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ์ฃผ์ด์ผ ํฉ๋๋ค.
insert_html ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ํน์ ์นํ์ด์ง ์์ ํ ์๋ฆฌ๋จผํธ์ ์ปจํ ์ธ ๋ฅผ ์ฝ์ ํ ์ ์์ต๋๋ค.
page.insert_html :top, :result, โ42โ
๋๋ฒ์งธ ๋งค๊ฐ๋ณ์์ DOM ์์ด๋๋ฅผ ๊ฐ์ง ์๋ฆฌ๋จผํธ์ ์๋์ ์ธ ์์น๋ฅผ ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ง์ ํด์ ์๋ก์ด ์ปจํ ์ธ ๋ฅผ ๋๊ธฐ๊ฒ ๋ฉ๋๋ค.
์๋์ ์ธ ์์น๋ ๋ค์์ 4๊ฐ์ง ๊ฐ ์ค์ ํ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- :before : ๋์ ์๋ฆฌ๋จผํธ ์ง์ ์ ์๋ฒ ์๋ต ํ ์คํธ๋ฅผ ์ฝ์ ํฉ๋๋ค.
- :after : ๋์ ์๋ฆฌ๋จผํธ ์งํ์ ์๋ฒ ์๋ต ํ ์คํธ๋ฅผ ์ฝ์ ํฉ๋๋ค.
- :top : ๋์ ์๋ฆฌ๋จผํธ์ ์๋ณธ ์ง์ ์ ํ ์คํธ๋ฅผ ์ฝ์ ํฉ๋๋ค.
- :bottom (:top ์ ๋ฐ๋ ์ต์ ) : ๋์ ์๋ฆฌ๋จผํธ์ ์๋ณธ ์งํ์ ์๋ต์ ์ฝ์ ํฉ๋๋ค.
์ธ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ๋ฌธ์์ด์ด๊ฑฐ๋ ActionView::Base#render ์ ๋๊ฒจ์ฃผ๋ ํด์ฌํํ์ ์ต์ ์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด โฆ
page.insert_html :top, :result, :partial => โthe_answerโ
replace_htmel ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ํน์ ์๋ฆฌ๋จผํธ์ ๋ด์ฉ(innerHTML)์ ๊ต์ฒดํ ์ ์์ต๋๋ค. ์ ์ผํ ์ฐจ์ด์ ์ด๋ผ๋ฉด ์๋ก์ด ๋ด์ฉ์ด ์์นํ ๊ณณ์ด ๋ถ๋ฉดํ๊ธฐ ๋๋ฌธ์ ์์น ๋งค๊ฐ๋ณ์๊ฐ ํ์์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ replace_html ์ 2๊ฐ์ ์ธ์๋ง ํ์ํ๋ฉฐ, ์ด๋ค ์ธ์๋ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ์๋ฆฌ๋จผํธ์ DOM ์์ด๋์ ActionView::Base#render๋ก ๋๊ฒจ์ฃผ๋ ๋ฌธ์์ด์ด๋ ํด์ฌํ์ ์ต์ ์ ๋๋ค.
dealy ์ด์ฉํ์ฌ ์ฝ๋๋ธ๋ญ์ ์คํ์ ์ง์ฐ์ํฌ ์ ์์ต๋๋ค.
page.delay(10) { page.alert(โHey! Just waited 10 secondsโ) }
delay ๋ ์ด๋จ์์ ์ง์ฐ์๊ฐ๊ณผ ์ง์ ์๊ฐ๋งํผ ์ง์ฐํด์ ์คํํ ์ฝ๋๋ธ๋ญ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ต๋๋ค. ๋ธ๋ญ์ ์ง์ ๋ ์ฝ๋๋ง์ด ์ง์ฐ๋๊ณ page.delay ๋ผ์ธ ์ดํ์ ์ค๋ ๋ชจ๋ ์ฝ๋๋ค์ ์ฆ์์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
reload ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์นํ์ด์ง๋ฅผ ๋ค์ ๋ก๋ํ ์ ์์ต๋๋ค.
page.reload
AJAX๋ฅผ ์ฌ์ฉํ ๋, ํ์ค redirect_to ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋์ ์ page ์ ์ธํธํด์ค ๋ฉ์๋์ธ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง redirect_to ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
page.redirect_to some_url
๋๋๋ก RJS์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์๋ ๋ถ๊ตฌํ๊ณ ๋ชจ๋ ๊ฒ์ ๋คํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ฉ์ ํ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ์, ๋ฉ์ง ๋์์ด ์์ต๋๋ค. <<, assign ๊ทธ๋ฆฌ๊ณ call ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
page << โalert(โ1+1 equals 3โ)โ<< ๋ฅผ ์ด์ฉํด์ ๋ฌธ์์ด์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋๊ฒจ ์ฃผ์ด ์คํํ ์ ์์ต๋๋ค. ์์ ์ฝ๋๋ ๋ค์ ์ฝ๋์ ๋์ผํฉ๋๋ค.
page.assign :result, 3 page.call :alert, โ1+1 equals โ + resultassign ์ ๊ทธ๋ฅ ๋ณ์์ ๊ฐ์ ํ ๋นํฉ๋๋ค. call ๋ << ์ ๋น์ทํ์ง๋ง ์ฝ๊ฐ ๋ค๋ฅธ ๋ฌธ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ํธ์ถํ๋ ค๋ ํจ์์ ์ด๋ฆ์ด๊ณ , ๋ค์์ ์ค๋ ๋งค๊ฐ๋ณ์ ๋ฆฌ์คํธ๋ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ์ง๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธํ๊ธฐ๋ ๋ง์ ๋งํฌ ํธ์จ์ธ์ "Classic"์ด๋ ์ฑ ์ ์๊ฐ๋๊ฒ ํฉ๋๋ค. "ํด๋์์ ๋ชจ๋ ์ฌ๋์ด ์ด๋ฏธ ์ฝ์ ์ฑ ์ด๊ธฐ๋ฅผ ๋ฐ๋ผ์ง๋ง ์ด๋ ๋๊ตฌ๋ ์ฝ๊ณ ์ถ์ดํ์ง ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธํ๊ธฐ๋ ๋น์ทํฉ๋๋ค. ์ฆ, ๋ชจ๋๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธํ๊ธฐ๋ฅผ ์ํ์ง๋ง ๋๋ฌด ์ง๋ฃจํ๊ณ ๋ณต์กํ์ฌ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ํ์ง ์๋๋ค ๊ฒ์ ๋๋ค. ์ด์ ๋ํ ํด๋ค์ด ๋ง์ด ๋์ค๊ณ ์๊ณ ๋๊ตฌ๋๊ฐ ์ธ์ ํ๋ ์ต์์ ๋ฐฉ๋ฒ์ด ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ์๋ํ๊ณ ์์ต๋๋ค.
- (Fire)Watir
- Selenium
- Celerity/Culerity
- Cucumber+Webrat
- Mention stuff like screw.unit/jsSpec
๋ ธํธ ๋จ๊ธฐ๊ธฐ : RailsConf JS testing video ํ์ธํ๊ธฐ