Skip to content
This repository has been archived by the owner on Jan 7, 2021. It is now read-only.

Ajax on rails.textile

hschoimd edited this page Jun 6, 2011 · 22 revisions

๋ ˆ์ผ์Šค์—์„œ์˜ AJAX

์ด ์•ˆ๋‚ด์„œ๋Š” ๋ ˆ์ผ์Šค์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” Ajax/JavsScript ๊ธฐ๋Šฅ์„ฑ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์–ด์„œ ๋‹ค์–‘ํ•˜๊ณ  ๋™์ ์ธ AJAX ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‹ค๋ฃฐ ์ฃผ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • AJAX์™€ ๊ด€๋ จ๋œ ๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์†Œ๊ฐœ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ ˆ์ผ์Šค๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ: Rails helpers, RJS, Prototype and script.aculo.us
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

endprologue.

์•ˆ๋…•, AJAX โ€“ ๊ฐ„๋žตํ•œ ์†Œ๊ฐœ

โ€˜show me the codeโ€™ํ˜•์˜ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์ด ๋ถ€๋ถ„์„ ๊ฑด๋„ˆ๋ ๊ณ  RJS ๋ถ€๋ถ„์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์‹ถ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ด ๋ถ€๋ถ„์„ ์ฝ์–ด ๋ณผ ๊ฒƒ์„ ์ •๋ง๋กœ ๊ถŒํ•˜๋Š”๋ฐ, ๋ ˆ์ผ์Šค์—์„œ Ajax๋ฅผ ์ž˜ ์ดํ•ดํ•˜๋ ค๋ฉด ์—ฌ๊ธฐ์„œ ์–ธ๊ธ‰๋˜๋Š” DOM์˜ ๊ธฐ๋ณธ๊ฐœ๋…, http ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ๊ธฐํƒ€ ๋‹ค๋ฅธ ํ† ํ”ฝ๋“ค์ด ํ•„์š”ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

AJAX

(= Asynchronous JavaScript and XML)

Ajax์˜ ๊ธฐ๋ณธ ์šฉ์–ด์„ค๋ช…, ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ์‹

DOM ๊ฐ์ฒด

DOM ์˜ ๊ธฐ๋ณธ๊ฐœ๋…, DOM ์ด ๋งŒ๋“ค์–ด์ง„ ๋ฐฉ๋ฒ•, DOM ์˜ ์†์„ฑ, ํŠน์ง•, DOM ์ด AJAX ์˜ ํ•ต์‹ฌ์ธ ์ด์œ 

Standard HTML communication vs AJAX

ํ†ต์ƒ์ ์ธ ์š”์ฒญ๊ณผ AJAX์š”์ฒญ์˜ ์ฐจ์ด์ , ๋ ˆ์ผ์Šค์—์„œ AJAX ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ์˜ ์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์˜ ์ค‘์š”์„ฑ(๋‹ค์Œ ์„น์…˜์— ์–ธ๊ธ‰๋˜๋Š” *_remote ํ—ฌํผ๋ฉ”์†Œ๋“œ์™€ ์—ฐ๊ด€๋จ)

๋‚ด์žฅ ๋ ˆ์ผ์Šค ํ—ฌํผ๋ฉ”์†Œ๋“œ

๋ ˆ์ผ์Šค์˜ ๊ธฐ๋ณธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Prototype ์ž…๋‹ˆ๋‹ค. Prototype ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์„œ DOM ๊ฐ์ฒด ์กฐ์ž‘๊ณผ AJAX ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๊ทธ์™ธ์—๋„ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด์ง€ํ–ฅ์  ๊ตฌ์กฐ์— ์ด๋ฅด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ์คŒ์œผ๋กœ์จ ๋™์ ์ธ ์›น์–ดํ”„๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด ์กŒ์Šต๋‹ˆ๋‹ค. Prototype ์€ ํŠน์ •์–ธ์–ด๋ฅผ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด์™€ ๊ด€๋ จ๋œ ๋‹ค์ˆ˜์˜ ํ—ฌํผ๋ฉ”์†Œ๋“œ๋ฅผ ๋ ˆ์ผ์Šค๊ฐ€ ์ œ๊ณตํ•ด์„œ Prototype์ด ๋ ˆ์ผ์Šค ๋ทฐ ํŒŒ์ผ๋“ค๊ณผ ๋งค๋„๋Ÿฝ๊ฒŒ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ—ฌํผ๋ฉ”์†Œ๋“œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•ด์•ผ ํ•  ๊ฒƒ์€ ๋Œ€๊ฐœ๋Š” application.html.erb์™€ ๊ฐ™์€ ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ์ƒ์œ„ ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์— Prototype ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

javascript_include_tag โ€˜prototypeโ€™

์ด์ œ ๋ ˆ์ผ์Šค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— AJAX์— ๋Œ€ํ•œ ์‚ฌ๋ž‘์„ ๋”ํ•ด ์ค„ ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ „ํ˜•์ ์ธ AJAX ๋ ˆ์ผ์Šค ํ—ฌํผ๋ฉ”์Šค๋“œ: link_to_remote

์•„๋งˆ๋„ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํ—ฌํผ๋ฉ”์†Œ๋“œ์ธ 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โ€™).value) + โ€˜&amp;completed=โ€™ + $(โ€˜completedโ€™)โ€

์ด ์ฝ”๋“œ๋Š” ์›นํŽ˜์ด์ง€๋‚ด์˜ โ€™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 ๋Œ€ํ•œ ์„ค๋ช…์„ ๋งˆ์นฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํ—ฌํผํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ์†Œํ™”ํ•˜๊ธฐ์—๋Š” ๋งŽ์€ ์–‘์ด์ง€๋งŒ ๊ธฐ์–ตํ•  ๊ฒƒ์€ ์ด ์˜ต์…˜๋“ค์€ ๋ ˆ์ผ์Šค ๋ทฐ ํ—ฌํผ๋ฉ”์†Œ๋“ค์— ๋Œ€ํ•ด์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋‹ค์Œ ์„น์…˜์—์„œ ์ฐจ์ด์ ๊ณผ ์ถ”๊ฐ€๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์— ๋Œ€ํ•ด์„œ ์•Œ์•„ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

AJAX ํผ

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 ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค.

์ž‘๋™๋˜๋Š” ๊ฒƒ์€ ํ•˜๋‚˜์”ฉ ์•Œ์•„ ๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค!

remote_form_for
form_remote_tag
submit_to_remote

h4(#). ์—˜๋ฆฌ๋จผํŠธ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ

observe_field
observe_form

์ฃผ๊ธฐ์ ์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ

periodically_call_remote

๊ธฐํƒ€ ํ•จ์ˆ˜

remote_function
update_page

๋ ˆ์ผ์Šค ๋ฐฉ์‹(RJS)์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋”ฉํ•˜๊ธฐ

์ง€๋‚œ ์„น์…˜์—์„œ, ์„œ๋ฒ„์— ๋ช‡๊ฐ€์ง€ AJAX ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ( :update ์˜ต์…˜์„ ์ด์šฉํ•ด์„œ) ์›นํŽ˜์ด์ง€์— HTML์‘๋‹ต์„ ์‚ฝ์ž…ํ•œ ๋ฐ” ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋•Œ๋กœ๋Š” ์ข€ ๋” ๋ณต์žกํ•œ ๋™์ž‘์„ ์›นํŽ˜์ด์ง€์— ์ ์šฉํ•ด์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ๋ฐ”๋กœ ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋‚˜ RJS๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘์—์„œ ์„œ๋ฒ„๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ช…๋ น์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋Š”๋ฐ, ์ „์ž์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ, ํ›„์ž์˜ ๊ฒฝ์šฐ๋Š” ๋ ˆ์ผ์Šค๋กœ ์ฝ”๋”ฉ์„ ํ•˜๊ณ  ์ž ์‹œ ๋ ˆ์ผ์Šค๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ RJS๊ฐ€ ๋ฃจ๋น„ DSL์ด์–ด์„œ ๋ ˆ์ผ์Šค ์ฝ”๋“œ๋‚ด์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

RJS๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋”ฉํ•˜๊ธฐ

๋จผ์ € ์„œ๋ฒ„๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฐฅ์„ ์•Œ์•„๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์—†๊ฒ ์ง€๋งŒ ์–ด๋–ค ์ƒํ™ฉ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ด์• ํ•ด ๋‘๋Š” ๊ฒƒ์€ ์žฌ๋ฏธ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

def javascript_test
render :text => โ€œalert(โ€˜Hello, world!โ€™)โ€,
:content_type => โ€œtext/javascriptโ€
end

(์ฃผ์˜: ๋ฐ”๋กœ ์œ„์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ ๊ฒ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, javascript_test ์•ก์…˜์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” :url ์˜ต์…˜์„ ์„ค์ •ํ•ด์„œ link_to_remote ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

์œ„์˜ ๋ฉ”์†Œ๋“œ์—์„œ๋Š” ํ—ค๋”๋ณ€์ˆ˜์ธ Content-Type์„ ์ง€์ •ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ ธ๊ฐ€ ์ „์†ก๋˜๋Š” ํ…์ŠคํŠธ๋ฅผ ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ๋กœ ๋ณด์ง€ ์ฃผ์ง€ ์•Š๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋””ํดํŠธ ๋™์ž‘์„ ํ•˜๋„๋ก ์ง€์‹œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ธ๋ผ์ธ RJS

์–ธ๊ธ‰ํ–ˆ๋˜ ๋ฐ”์™€ ๊ฐ™์ด, 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 ์ฝ”๋“œ๋ฅผ ๋ทฐ ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ RJS ํ…œํ”Œ๋ฆฟ์€ /app/views/ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋ฉฐ, ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์˜ .html.erb ์ด๋‚˜ ๋‹ค๋ฅธ ๋ทฐ ํŒŒ์ผ ํ˜•ํƒœ, ๋Œ€๊ฐœ๋Š” js.rjs ํŒŒ์ผ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ฉด, ์•ก์…˜ ์ฝ”๋“œ๋ถ€๋ถ„์„ ๋น„์›Œ๋‘๊ณ  javascript_test.js.rjs ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ RJS ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ํผํ•จ์‹œ์ผœ ๋‘ก๋‹ˆ๋‹ค.

page.alert โ€œHello from inline RJSโ€

RJS Reference

์ด ์„น์…˜์—์„œ๋Š” RJS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

JavaScriptGenerator ๋ฉ”์†Œ๋“œ
DOM ์—˜๋ฆฌ๋จผํŠธ ๋‹ค๋ฃจ๊ธฐ

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 โ€™ + result

assign ์€ ๊ทธ๋ƒฅ ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. call ๋Š” << ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ˜ธ์ถœํ•˜๋ ค๋Š” ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด๊ณ , ๋‹ค์Œ์— ์˜ค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ๋Š” ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ์ง‘๋‹ˆ๋‹ค.

ํด๋ž™์Šค ํ”„๋ก์‹œ
์—˜๋ฆฌ๋จผํŠธ ํ”„๋ก์‹œ
์ปฌ๋ ‰์…˜ ํ”„๋ก์‹œ
RJS ํ—ฌํผ๋ฉ”์†Œ๋“œ

I Want my Yellow Thingy: Script.aculo.us์˜ ๊ฐ„๋‹จํ•œ ๊ฐœ์š”

์†Œ๊ฐœ

์‹œ๊ฐ์  ํšจ๊ณผ

Drag and Drop

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋ž€ ๋ง์€ ๋งˆํฌ ํŠธ์›จ์ธ์˜ "Classic"์ด๋ž€ ์ฑ…์„ ์ƒ๊ฐ๋‚˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. "ํด๋ž˜์‹์€ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๋ฏธ ์ฝ์€ ์ฑ…์ด๊ธฐ๋ฅผ ๋ฐ”๋ผ์ง€๋งŒ ์–ด๋Š ๋ˆ„๊ตฌ๋„ ์ฝ๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋„ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋‘๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ์ง€๋ฃจํ•˜๊ณ  ๋ณต์žกํ•˜์—ฌ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•˜์ง€ ์•Š๋Š”๋‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํˆด๋“ค์ด ๋งŽ์ด ๋‚˜์˜ค๊ณ  ์žˆ๊ณ  ๋ˆ„๊ตฌ๋‚˜๊ฐ€ ์ธ์ •ํ•˜๋Š” ์ตœ์ƒ์˜ ๋ฐฉ๋ฒ•์ด ์—†์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • (Fire)Watir
  • Selenium
  • Celerity/Culerity
  • Cucumber+Webrat
  • Mention stuff like screw.unit/jsSpec

๋…ธํŠธ ๋‚จ๊ธฐ๊ธฐ : RailsConf JS testing video ํ™•์ธํ•˜๊ธฐ

Clone this wiki locally