working with javascript in rails

37
Working with Javascript in Rails 70 Biweekly Lecture 2014-09-16 SeungKyun Nam - ROR Lab. Season 3 -

Upload: seungkyun-nam

Post on 22-May-2015

581 views

Category:

Technology


1 download

DESCRIPTION

RoR Lab BiWeekly Lecture 70 Session 1 Working with Javascript in Rails * 스크린 캐스트 정보 - 주최 : Ruby On Rails Korea(https://www.facebook.com/groups/rubyonrailskorea/) - 후원 : Naver D2(https://www.facebook.com/naverd2)

TRANSCRIPT

Page 1: Working with Javascript in Rails

Working with Javascriptin Rails

�70�BiweeklyLecture

2014-09-16

SeungKyunNam

- ROR Lab. Season 3 -

Page 2: Working with Javascript in Rails

Agenda

Ajax:IntroductionUnobtrusiveJavascriptBuilt-inHelpersAjax:Server-SideConcernsTurbolinks

Page 3: Working with Javascript in Rails

Ajax: Introduction

WhatisAjax:

AsynchronousJavascriptandXML

Page 4: Working with Javascript in Rails

Ajax: Introduction

Theoriginofthetermcalled'Ajax'

byAdaptivePathBlogpost:Ajax:but...

ANewApproachtoWebApplications

Page 5: Working with Javascript in Rails

Ajax: IntroductionUnderstandingRequest-ResponseCycle

Page 6: Working with Javascript in Rails

Ajax: IntroductionClassicModelvsAJaxModel

Page 7: Working with Javascript in Rails

Ajax: IntroductionSynchronousModelvsAsynchronousModel

Page 8: Working with Javascript in Rails

Ajax: IntroductionDefiningAjax

Presentation:XHTMLandCSS->HTML5andCSS3DocumentObjectModelData:XMLandXSLT->(mostlyJSON)Carrier:XMLHttpRequestBindingeverythingtogether:Javascript

Page 9: Working with Javascript in Rails

Ajax: IntroductionSampleCode

//COFFEESCRIPT$.ajax(url:"/test/lorem").done(html)->$("#results").appendhtml

//GeneratedJAVASCRIPT(function(){$.ajax({url:"/test/lorem"}).done(function(html){return$("#results").append(html);});

}).call(this);

Page 10: Working with Javascript in Rails

Ajax: IntroductionDemo

Page 11: Working with Javascript in Rails

Unobtrusive JavascriptThreemaingoals

ToseparateJavaScriptfromHTMLmarkup,aswellaskeepingmodulesofJavaScriptindependentofothermodules.UnobtrusiveJavaScriptshoulddegradegracefully-allcontentshouldbeavailablewithoutalloranyoftheJavaScriptrunningsuccessfully.UnobtrusiveJavaScriptshouldnotdegradetheaccessibilityoftheHTML,andideallyshouldimproveit,whethertheuserhaspersonaldisabilitiesorareusinganunusual,orunusuallyconfigured,browser.

Page 12: Working with Javascript in Rails

Tip:TocomplieCoffeeScript

withouttop-levelfunctionsafetywrapper

#CompiletheJavascriptwithoutthetop-levelfunctionsafetywrapper#CoffeeScriptOption-bor--bareTilt::CoffeeScriptTemplate.default_bare=true

config/environment.rb

Page 13: Working with Javascript in Rails

Traditional WayInlineJavascript

<ahref="#"onclick="this.style.backgroundColor='#009900';this.style.color='#FFFFFF'">Paintitgreen</a>

Page 14: Working with Javascript in Rails

Traditional (Better) WayUsingFunctions

paintIt=(element,backgroundColor,textColor)->element.style.backgroundColor=backgroundColoriftextColor?element.style.color=textColor

<ahref="#"onclick="paintIt(this,'#990000')">Paintitred</a><ahref="#"onclick="paintIt(this,'#009900','#FFFFFF')">Paintitgreen</a>

Page 15: Working with Javascript in Rails

Unobtrusive Way

paintIt=(element,backgroundColor,textColor)->element.style.backgroundColor=backgroundColoriftextColor?element.style.color=textColor

$->$("a[data-background-color]").click->backgroundColor=$(this).data("background-color")textColor=$(this).data["text-color"]paintIt(this,backgroundColor,textColor)

<ahref="#"data-background-color="#990000">Paintitred</a><ahref="#"data-background-color="#009900"data-text-color="#FFFFFF">Paintitgreen</a><ahref="#"data-background-color="#000099"data-text-color="#FFFFFF">Paintitblue</a>

Page 16: Working with Javascript in Rails

Unobtrusive JavascriptDemo

Page 17: Working with Javascript in Rails

Built-in HelpersRailsAjaxhelpersareintwoparts

Javascripthalf->rails.jsRubyhalf->addappropriatetagstoDOM

Page 18: Working with Javascript in Rails

form_for

<%=form_for(@post,remote:true)do|f|%>...<%end%>

<!--GeneratedHTML--><formaccept-charset="UTF-8"action="/posts"class="new_post"data-remote="true"id="new_post"method="post">...</form>

Page 19: Working with Javascript in Rails

form_forAddingAjaxEvent

$(document).ready->$("#new_post").on("ajax:success"),(e,data,status,xhr)->$("#new_post").appendxhr.responseText).bind"ajax:error",(e,data,status,error)->$("#new_post").append"<p>ERROR</p>"

Page 20: Working with Javascript in Rails

form_tag

<%=form_tag('/posts',remote:true)%>

Page 21: Working with Javascript in Rails

link_to

<%=link_to"apost",@post,remote:true%>

<!--GeneratedHTML--><ahref="/posts/1"data-remote="true">apost</a>

Page 22: Working with Javascript in Rails

link_toAddingAjaxEvent

<%=link_to"DeletePost",@post,remote:true,method::delete%>

$->$("a[data-remote]").on"ajax:success",(e,data,status,xhr)->alert"Thepostwasdeleted."

Page 23: Working with Javascript in Rails

button_to

<%=button_to"Apost",@post,remote:true%>

<!--GeneratedHTML--><formaction="/posts/1"class="button_to"data-remote="true"method="post"><div><inputtype="submit"value="Apost"></div></form>

Page 24: Working with Javascript in Rails

Built-in HelpersDemo

Page 25: Working with Javascript in Rails

Server-Side Concerns

Page 26: Working with Javascript in Rails

Server-Side ConcernsbyExample

classUsersController<ApplicationControllerdefindex@users=User.all@user=User.newend

#...end

<b>Users</b>

<ulid="users"><li> </li></ul>

<br>

<br>

app/views/users/index.html.erb

app/controllers/users_controller.rb

<li> </li>

app/views/users/_user.html.erb

Page 27: Working with Javascript in Rails

Server-Side ConcernsbyExample

#...defcreate@user=User.new(params[:user])

respond_todo|format|[email protected]{redirect_to@user,notice:'Userwassuccessfullycreated.'}format.js{}format.json{renderjson:@user,status::created,location:@user}elseformat.html{renderaction:"new"}format.json{renderjson:@user.errors,status::unprocessable_entity}endendend#...

app/controllers/users_controller.rb

Page 28: Working with Javascript in Rails

Server-Side ConcernsbyExample

$("<%=escape_javascript(render@user)%>").appendTo("#users")

app/views/users/create.js.erb

Page 29: Working with Javascript in Rails

Server-Side ConcernsDemo

Page 30: Working with Javascript in Rails

Turbolinks

Rails4DefaultTurbolinksGemUsesAjaxtospeeduppagerenderingPushState

Page 31: Working with Javascript in Rails

TurbolinksHowitworks

attachesaclickhandlertoall<a>tagscheckifbrowsersupportsPushStateifso,

makeanAjaxrequestparsetheresponsereplacetheentire<body>changetheURLusingPushState

Page 32: Working with Javascript in Rails

PushStateapartofHTML5History-API

<!doctypehtml><html><head><title>PushStateExample</title><scriptlanguage="javascript">

Page 33: Working with Javascript in Rails

Using Turbolinks

#Turbolinksmakesfollowinglinksinyourwebapplicationfaster.#Readmore:https://github.com/rails/turbolinksgem'turbolinks'

Gemfile

//=requireturbolinks

app/assets/javascripts/applications.js

Page 34: Working with Javascript in Rails

TurbolinksTodisableTurbolinksforcertainlinks

<ahref="..."data-no-turbolinks>Noturbolinkshere</a>.

usingdata-no-turbolinksattribute

Page 35: Working with Javascript in Rails

TurbolinksTroubleshooting

$(document).ready->alert"pagehasloaded!"

#ThiseventwillnotworkbecauseofTurbolinks

$(document).on"page:change",->alert"pagehasloaded!"

#Thiswillwork!

Page 36: Working with Javascript in Rails

TurbolinksDemo

Page 37: Working with Javascript in Rails

Thank you