ãšã³ããªã¬ãã«ã§ã¯ããã®ãããªç¿»èš³ã¯Railsã³ãã¥ããã£ã®çºå±ã«è²¢ç®ããŠããŸããããã«ããã¹ãã§ã¯ãæäœã§ç€ºãããŠãããã¹ãŠã®ãã®ãç§ã®ã³ã¡ã³ãïŒå€ãã¯ãããŸããïŒReact.jsã®æŠèŠReact.jsã¯JavaScriptãã¬ãŒã ã¯ãŒã¯ããŒã ã®æ°ãã人æ°è
ã§ããããã®ã·ã³ãã«ããéç«ã£ãŠããŸãã ä»ã®ãã¬ãŒã ã¯ãŒã¯ãå®å
šãª
MVC ïŒModel View ControllerïŒã¢ãããŒããå®è£
ããå Žåããã¥ãŒïŒãã£ã¹ãã¬ã€ïŒïŒäºå®-äžéšã®äººã
ã¯ãããã®ãã¬ãŒã ã¯ãŒã¯ã®ãã£ã¹ãã¬ã€ïŒVïŒã®äžéšãReactã§æžãæããïŒã®ã¿ãå®è£
ããããã«Reactã«æ瀺ã§ããŸãã
Reactã¢ããªã±ãŒã·ã§ã³ã¯ãã³ã³ããŒãã³ããšã¹ããŒã¿ã¹ã®2ã€ã®åºæ¬ååã«åºã¥ããŠããŸãã ã³ã³ããŒãã³ãã¯ãçµã¿èŸŒã¿ãŸãã¯ã«ã¹ã¿ã ã®å°ããªã³ã³ããŒãã³ãã§æ§æã§ããŸãã Facebookã®ã¹ã¿ãããäžæ¹åã®ãªã¢ã¯ãã£ãããŒã¿ã¹ããªãŒã ãåŒã³åºãããšã¯ãã€ã³ã¿ãŒãã§ã€ã¹ïŒUIïŒããã¹ãŠã®ç¶æ
å€åã«å¯Ÿå¿ããããšãæå³ããŸãã
React.jsã®åªããæ©èœã®1ã€ã¯ãè¿œå ã®äŸåé¢ä¿ãå¿
èŠãšããªãããšã§ããããã«ãããjsã©ã€ãã©ãªãšã®æ¥ç¶ãä¿èšŒãããŸãã ããã䜿çšããŠãå€éšã€ã³ã¿ãŒãã§ã€ã¹ãäœæããããã«Railsã¹ã¿ãã¯ã«å«ãããããã¹ããã€ãã®ã¬ãŒã«ããäœæããããã«èšãããšãã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã³ã¹ããã©ããã³ã°ã¬ã€ã¢ãŠã
ãã®ã¬ã€ãã§ã¯ãå°ããªã¢ããªã±ãŒã·ã§ã³ããŒãããäœæããŠãã¢ã¯ã·ã§ã³ã远跡ããŸãã åã¬ã³ãŒãïŒ
以éãRecordãšåã ïŒã¯ãæ¥ä»ãååãããã³éé¡ã§æ§æãããŸãã ãšã³ããªã¯ãéé¡ããŒããã倧ããå Žåã¯ã¯ã¬ãžãããšèŠãªããããã以å€ã®å Žåã¯ã¯ã¬ãžãããšèŠãªãããŸãã ãããžã§ã¯ãã®ã¬ã€ã¢ãŠãã¯æ¬¡ã®ãšããã§ãã
åèšãããšãã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ããã«åäœããŸãã
- ãŠãŒã¶ãŒã氎平圢åŒã§æ°ããã¬ã³ãŒããäœæãããšãã¬ã³ãŒãããŒãã«ã«æ¿å
¥ãããŸã
- ãŠãŒã¶ãŒã¯æ¢åã®æçš¿ãç·šéã§ããŸãã
- [åé€]ãã¿ã³ãã¯ãªãã¯ãããšãããŒãã«ããé¢é£ä»ããåé€ãããŸãã
- æ¢åã®ã¬ã³ãŒããè¿œå ãç·šéããŸãã¯åé€ãããšãããŒãžäžéšã®ããã¯ã¹ã®éãæŽæ°ãããŸã
Railsãããžã§ã¯ãã§React.jsãåæåãã
ãŸããæ°ãããããžã§ã¯ããäœæããå¿
èŠããããŸããããã
AccountsãšåŒã³ãŸããã
rails new accounts
ãã®ãããžã§ã¯ãã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ã
bootstrap
ã䜿çšããŸãã ã€ã³ã¹ããŒã«ããã»ã¹ã¯ãã®èšäºã®ç¯å²å€ã§ããã
gitãªããžããªããã®æ瀺ã䜿çšããŠå
¬åŒã®
bootstrap-sass
ãã€ã³ã¹ããŒã«ã§ã
ãŸã ã
ããã§ãããžã§ã¯ããã€ã³ã¹ããŒã«ãããŸããã
React
æ¥ç¶ãç¶ç¶ããŸãã ãã®ã¬ã€ãã§ã¯ããã®gemã®ã¯ãŒã«ãªæ©èœã䜿çšãããããå
¬åŒã®gemããæ¥ç¶ããããšã«ããŸããããRailsã䜿çšããŠç®æšãéæããå¥ã®æ¹æ³ãããããå
¬åŒããŒãžãããœãŒã¹ã³ãŒããããŠã³ããŒãããŠ
javascripts
ãã©ã«ããŒã«è²Œãä»ããããšãã§ããŸãã
Railsã¢ããªã±ãŒã·ã§ã³ãéçºããŠããå Žåã¯ãgemã®ã€ã³ã¹ããŒã«ãããã«ç°¡åããç¥ã£ãŠããŸãïŒ
Gemfile
ãžã®
react-rails
è¿œå
gem 'react-rails', '~> 1.0'
次ã«ãã¬ãŒã«ã«æ°ããgemãã€ã³ã¹ããŒã«ããããã«èŠªåã«äŒããŸã
bundle install
React-railsã«ã¯ã
Reactã³ã³ããŒãã³ããååšãã
app/assets/javascripts
ãã©ã«ããŒå
ã«
components.js
ãã¡ã€ã«ãäœæããã¹ã¯ãªãããã€ã³ã¹ããŒã«ãããŠããŸãã
rails g react:install
ã€ã³ã¹ããŒã«ãéå§ããåŸã«
application.js
ãã¡ã€ã«ãèŠããšã3ã€ã®æ°ããè¡ã衚瀺ãããŸãã
åºæ¬çã«ãããã«ã¯Reactã©ã€ãã©ãªãå«ãŸããã³ã³ããŒãã³ãããã³é¡äŒŒã®ãã¡ã€ã«ã¯
ujs
ä¿åãã
ujs
ãã¡ã€ã«åããæšæž¬ã§ããããã«ã
react-rails
ã¯Reactã³ã³ããŒãã³ãã®ã€ã³ã¹ããŒã«ã«åœ¹ç«ã¡ãTurbolinksã€ãã³ããåŠçããæ§ãããªJSãã©ã€ããŒãå«ãŸããŠããŸãã
ãªãœãŒã¹äœæ
Record
ãªãœãŒã¹ãäœæããŸããããã¯ãã¿ã€ãã«ïŒã¿ã€ãã«ïŒã®æ¥ä»ïŒæ¥ä»ïŒãšéé¡ïŒéé¡ïŒã§æ§æãããŸãã
scaffold
çæã䜿çšãã代ããã«ã
resource
ãžã§ãã¬ãŒã¿ã䜿çšããŸãã
scaffoldãžã§ãã¬ãŒã¿ã䜿çšããŠäœæããããã¹ãŠã®ãã¡ã€ã«ãšã¡ãœããã䜿çšããããã§ã¯ãããŸããã ããããªããšãscaffoldãèµ·åããŠæªäœ¿çšã®ãã¡ã€ã«/ã¡ãœãããåé€ããããšãå¯èœã«ãªããŸããããã®å Žåã®ãããžã§ã¯ãã¯å°ãæ±ãã§ãããã ãã®åŸããããžã§ã¯ãå
ã§æ¬¡ã®ã³ãã³ããå®è¡ããŸãã
rails g resource Record title date:date amount:float
ãã®éæ³ã®åŸãæ°ããã¢ãã«ïŒã¢ãã«ïŒã³ã³ãããŒã©ãŒïŒã³ã³ãããŒã©ãŒïŒãšã«ãŒãïŒã«ãŒãïŒãã§ããŸããã 次ã«ãããŒã¿ããŒã¹ãäœæãã移è¡ãå®è¡ããŸãã
rake db:create db:migrate
ããã«ã次ã®æ¹æ³ã§ããã€ãã®ã¬ã³ãŒããäœæã§ããŸãã
rails console Record.create title: 'Record 1', date: Date.today, amount: 500 Record.create title: 'Record 2', date: Date.today, amount: -100
ãµãŒããŒãèµ·åããããšãå¿ããªãã§ãã ãã
rails s
ã§ããïŒ ã³ãŒããæžãããšãã§ããŸãã
ãã¹ããããã³ã³ããŒãã³ãïŒã¬ã³ãŒããªã¹ã
æåã®ã¿ã¹ã¯ã§ã¯ãäœæããã¬ã³ãŒããããŒãã«å
ã«ã¬ã³ããªã³ã°ããå¿
èŠããããŸãã
æåã«ã
RecordsController
å
ã«
index
ã¢ã¯ã·ã§ã³ãäœæããå¿
èŠããããŸãã
ããã§ã
apps/views/records/
ã«æ°ãã
index.html.erb
ãã¡ã€ã«ãäœæããå¿
èŠããããŸãããã®ãã¡ã€ã«ã¯ãRailsã¢ããªã±ãŒã·ã§ã³ãšReactã³ã³ããŒãã³ãéã®ããªããžã«ãªããŸãã ãã®ã¿ã¹ã¯ãå®è¡ããã«ã¯ããã«ããŒã¡ãœãã
react_component
ã䜿çšããŸãããã®ã¡ãœããã¯ãReactãšããååãååŸããŸããããã¯ãæž¡ãããŒã¿ãšå
±ã«ã¬ã³ããªã³ã°ããã³ã³ããŒãã³ãã§ãã
<%# app/views/records/index.html.erb %> <%= react_component 'Records', { data: @records } %>
ãã®ãã«ããŒã¯react-rails gemã«ãã£ãŠæäŸãããããšã«æ³šæããŠãã ãããå¥ã®çµ±åReactã¡ãœããã䜿çšããããšã«ããå Žåããã®ãã«ããŒã¯äœ¿çšã§ããŸããã
ããã§ã
localhost:3000/records
ã¢ã¯ã»ã¹ã§ããŸãã æããã«ãäœããæ£ããæ©èœããŠããŸãããããã¯ãã¹ãŠãã¬ã³ãŒãïŒReactã³ã³ããŒãã³ãïŒãæ¬ èœããŠããããã§ãã ããããçæãããHTMLããã©ãŠã¶ãŒå
ã«åã蟌ããšããã®ãããªãã®ãæ¿å
¥ã§ããŸãã
<div data-react-class="Records" data-react-props="{...}"> </div>
ãã®ããŒã¯ã¢ããã«ããã
react_ujs
ã¯Reactã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããããšããŠãããã©ãããå€æãã
react_ujs
ãä»ããŠéä¿¡ããèšå®ãå«ãã€ã³ã¹ã¿ã³ã¹ãäœæããŸãããã®å Žåãã³ã³ãã³ãã¯
@records
æåã®ã³ã³ããŒãã³ããäœæãã
javascripts/components
ãã£ã¬ã¯ããªå
ã«æ°ãããã¡ã€ã«
records.js.coffee
äœæããŸãããã®ãã¡ã€ã«ã«ã¯
Records
ã³ã³ããŒãã³ããå«ãŸããŸãã
åã³ã³ããŒãã³ãã«ã¯ãã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ãå€æŽããrenderã¡ãœãããå¿
èŠã§ã
ReactComponent
ã¡ãœããã¯ã
ReactComponent
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãå¿
èŠããããŸãããã®ãããReactãåã¬ã³ããªã³ã°ãå®è£
ãããšãæé©ã«å®è¡ãããŸãã
çºèšã å¥ã®ã±ãŒã¹ã§ã¯ãã¡ãœããã®ã¬ã³ããŒå
ã®
ReactComponents
ã€ã³ã¹ã¿ã³ã¹ã¯ãJSXæ§æã䜿çšããŠèšè¿°ã§ããŸãã
äžèšã®ã³ãŒããšåçïŒ
render: -> `<div className="records"> <h2 className="title"> Records </h2> </div>`
å人çã«ã¯ãCoffeeScriptã䜿çšããå Žåãã³ãŒãã¯HAMLã®ããã«éå±€æ§é ã«å€æãããããã
React.DOM
æ§æã䜿çšããããšã奜ã¿ãŸããæ¢åã®ERBã³ãŒããJSXã«å€æããŸãã
ãã©ãŠã¶ãæŽæ°
çŽ æŽãããã æåã®Reactã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããŸããã 次ã«ãã¡ã¢ã衚瀺ããŸãã
ããã«ãReactã³ã³ããŒãã³ãã®renderã¡ãœããã¯ãåã¬ã³ããªã³ã°ãå¿
èŠãã©ãããç解ããããã«ãèšå®ã䜿çšããŠä»ã®ã³ã³ããŒãã³ããç¶æ
ãšäº€æããããšã«äŸåããŠããŸãã ã³ã³ããŒãã³ãã®ç¶æ
ãšããããã£ãå¿
èŠãªå€ã§åæåããå¿
èŠããããŸãã
getDefaultProps
ã¡ãœããã¯ãããŒã¿ã®è»¢éãå¿ããå Žåãã€ã³ã¹ã¿ã³ã¹åãããšãã«ã³ã³ããŒãã³ãã®èšå®ãåæåãã
getInitialState
ã¡ãœããã¯ã³ã³ããŒãã³ãã®åæç¶æ
ãçæããŸãã éåžžãRailsãã¥ãŒã䜿çšããŠã¬ã³ãŒãã衚瀺ããå¿
èŠããããŸãã
è¡æ°ããã©ãŒãããããããã®ãã«ããŒã¡ãœãããå¿
èŠãªããã§ãè¡ã®ç°¡åãªãã©ãŒããããæ¿å
¥ããŠããã¹ãŠã®
coffee
ãã¡ã€ã«ã§äœ¿çšã§ããããã«ããŸã
utils.js.coffee
次ã®å
容ã®æ°ãã
utils.js.coffee
ãã¡ã€ã«ãäœæããŸãã
æ°ããRecordã³ã³ããŒãã³ããäœæããåã
ã®ã¬ã³ãŒãã衚瀺ãã
javascripts/components
ãã£ã¬ã¯ããªã«æ°ãã
record.js.coffee
ãã¡ã€ã«ãäœæããŠã次ã®ã³ãŒãã貌ãä»ããå¿
èŠããããŸãã
Recordã³ã³ããŒãã³ãã¯ãã¬ã³ãŒãã®åå±æ§ã®ã»ã«ãå«ãããŒãã«ã®åã«è¡šç€ºãããŸãã
React.DOM.*
ãããã®
React.DOM.*
ãã«ãŠã³ãããå¿é
ã¯ãããŸãã
React.DOM.*
åŒã³åºããã€ãŸããã³ã³ããŒãã³ãã«å±æ§ãæž¡ããªãããšãæå³ããŸã
React.DOM.*
ã次ã®ã³ãŒãã§ã³ã³ããŒãã³ãã®ã¬ã³ãŒãå
ã®renderã¡ãœãããæŽæ°ããŸãã
äœãèµ·ãã£ãã®ãèŠãŸãããïŒ å
éšã«ããããŒãšæ¬æãå«ãããŒãã«ãäœæããŸããã æ¢åã®åã¬ã³ãŒãã«å¯ŸããŠRecordèŠçŽ ãäœæããŸããã èšãæãããšããã«ãã€ã³/ã«ã¹ã¿ã Reactã³ã³ããŒãã³ããCoolããã¹ãããŠããŸãã ããïŒ
åçãªçžç¶äººïŒãã®å Žåã¯ã¬ã³ãŒãïŒãããå ŽåãèŠçŽ ãåçã«çæããããã®æ§æããŒãæäŸããå¿
èŠããããŸãããããã£ãŠãReactãUIïŒãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒãæŽæ°ããæéã¯ããŸããããŸããã
ããŒïŒRecordèŠçŽ ãäœæãããšãã«ãå®éã®ã¬ã³ãŒããšäžç·ã«
record.id
ã ãããè¡ããªãå Žåããã©ãŠã¶ãŒã®JSã³ã³ãœãŒã«ã§èŠåãååŸããå¿
èŠããããŸãïŒããããè¿ãå°æ¥ãé çã®çš®ã«ãªãããšããããŸãïŒã
ããã§ãã®ã»ã¯ã·ã§ã³ã®ã³ãŒããèŠãããã»ã¯ã·ã§ã³ã®
å€æŽãèŠãããšãã§ã
ãŸã ã
芪ãšåã®é¢ä¿ïŒã¬ã³ãŒãã®äœæ
äœæããããã¹ãŠã®ã¬ã³ãŒãã衚瀺ããæ°ããã¬ã³ãŒããäœæãããã©ãŒã ãå«ããããšãã§ããŸãã ãã®æ©èœãReact / Railsã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããŸãããã ãŸããã³ã³ãããŒã©ãŒã®
create method
ãè¿œå ããå¿
èŠã
create method
ãŸãïŒ
_strongparams
䜿çšãå¿ããªãã§ãã ããïŒ
class RecordsController < ApplicationController ... def create @record = Record.new(record_params) if @record.save render json: @record else render json: @record.errors, status: :unprocessable_entity end end private def record_params params.require(:record).permit(:title, :amount, :date) end end
次ã«ãReactã³ã³ããŒãã³ããäœæããæ°ããã¬ã³ãŒãã®äœæã远跡ããå¿
èŠããããŸãã ã³ã³ããŒãã³ãã«ã¯ãã¿ã€ãã«ã®æ¥ä»ãšéé¡ãä¿åããç¬èªã®ç¶æ
ããããŸãã
åµé çãªãã®ã§ã¯ãªããã€ã³ã©ã€ã³ããŒãã¹ãã©ãããã©ãŒã ã§ãã å
¥åå€ãèšå®ããŠå±æ§ã®å€ã決å®ããæ¹æ³ã«æ³šæããŠãã ãã
onChange
å±æ§ã¯ãããŒãæŒããããã³ã«åŒã³åºãããã¡ãœãããã¢ã¿ããããŠåŠçããŸããhandleChange
handleChange
ã¡ãœããã¯å±æ§åã䜿çšããå
¥åã«ããã€ãã³ããããªã¬ãŒãããå€ã®ç¶æ
ãæŽæ°ãããŸãã
# app/assets/javascripts/components/record_form.js.coffee
@RecordForm = React.createClass
...
handleChange: (e) ->
name = e.target.name
@setState "#{ name }": e.target.value
ååãtitleãšäžèŽããå Žåãæååã€ã³ã¿ãŒããªã¿ãŒã䜿çšããŠã
@setState title: e.target.value
ã«çžåœããããŒ
@setState title: e.target.value
ãåçã«æ±ºå®ããŸãã ãããããªã
@setState
ã䜿çšãã
@setState
ã§ããããïŒ éåžžã®JSãªããžã§ã¯ãã§éåžžè¡ãããã«ãç®çã®<coå€ã
stateã«èšå®ã§ããªãã®ã¯ãªãã§ããïŒ
@setState
ã¯2ã€ã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠããããããããã¯æ¬¡ã®ãšããã§ãã
- ã¹ããŒã¿ã¹ã³ã³ããŒãã³ãã®æŽæ°
- æ°ããç¶æ
ã«åºã¥ããŠUIãã§ãã¯/æŽæ°ãèšç»ãã
ã³ã³ããŒãã³ãå
ã§ç¶æ
ã䜿çšãããã³ã«ããã®æ
å ±ãã¡ã¢ãªã«ä¿æããããšãéåžžã«éèŠã§ãã renderã¡ãœããã®æåŸã«ããéä¿¡ãã¿ã³ãèŠãŠã¿ãŸããã
å€
!@valid()
ãšå
±ã«
disabled
å±æ§ãå®çŸ©ããŸãããããã¯ããŠãŒã¶ãŒãæäŸããããŒã¿ãæ£ãããã©ãããè©äŸ¡ããããã®æå¹ãªã¡ãœãããå®è£
ããããšãæå³ããŸãã
ç°¡åã«ããããã«ã空ã®è¡ã§
@state
å±æ§ãå床æ€èšŒããã ãã§ãã ãããã£ãŠãç¶æ
ãæŽæ°ãåä¿¡ãããã³ã«ã[
Create record
ãªã³/ãªãã®
Create record
]ãã¿ã³ã¯ããŒã¿ã®æ€èšŒã«äŸåããŸãã
ããã§ãã³ã³ãããŒã©ãŒãšãã©ãŒã ãé
眮ãããŸããã æ°ããã¬ã³ãŒãããµãŒããŒã«éä¿¡ããŸãã ã€ãã³ããã¬ãŒã³ããŒã·ã§ã³ãã©ãŒã ãåŠçããå¿
èŠããããŸãã ã¿ã¹ã¯ãå®äºããã«ã¯ããã©ãŒã ã®å±æ§ã
onSubmit
ãšæ°ãã
handleSubmit
ã¡ãœããã«è¿œå ããå¿
èŠããããŸãïŒ
onChange
ã€ãã³ãã§ãåãããšãè¡ã
onChange
ãïŒã
è¡ããšã«æ°ããã¡ãœããã確èªããŸãããã
- ãã©ãŒã ãéä¿¡ããªã
- çŸåšã®URLã®æ°ããã¬ã³ãŒãæ
å ±ãPOST
- æåããã³ãŒã«ããã¯
æåããã³ãŒã«ããã¯ã¯ããã®ããã»ã¹ã®éµã§ããæ°ããã¬ã³ãŒãã®äœæãæåããåŸã誰ãããã®ã¢ã¯ã·ã§ã³ãå ±åããå¿
èŠããããã¹ããŒã¿ã¹ãæ°ããå€ã«æŽæ°ãããŸãã ãã®ã³ã³ããŒãã³ããèšå®ïŒãŸãã¯
@props
ïŒãä»ããŠä»ã®ã³ã³ããŒãã³ããšããåãããããšã«ã€ããŠèšåãããšãã®ããšãèŠããŠããŸããïŒ ã ãããããã§ãã çŸåšã®ã³ã³ããŒãã³ãã¯ã
@props.handleNewRecord
ãä»ããŠèŠªã³ã³ããŒãã³ãã«æ
å ±ãéãè¿ããæ°ããã¬ã³ãŒããäœæãããããšãç¥ãããŸãã
ã
RecordForm
ã
RecordForm
èŠçŽ ãäœæãããšãã¯ã
React.createElement RecordForm
ã
handleNewRecord: @addRecord
ãªã©ã®ã¡ãœãããžã®åç
§ã
handleNewRecord
èšå®ãæž¡ãå¿
èŠããããŸãã ããŠã芪ã¬ã³ãŒãã³ã³ããŒãã³ãã¯ããã¹ãŠã®å Žæãã«ãããæ¢åã®ãã¹ãŠã®ã¬ã³ãŒãã®ç¶æ
ããããããæ°ããäœæããã¬ã³ãŒãã§ãã®ç¶æ
ãæŽæ°ããå¿
èŠããããŸã
addRecord
å
ã«æ°ãã
addRecord
ã¡ãœãããè¿œå ããh2ã¿ã€ãã«ã®çŽåŸïŒrenderã¡ãœããå
ïŒã«æ°ãã
RecordForm
èŠçŽ ãäœæããŸãã
ãã©ãŠã¶ãæŽæ°ãããã©ãŒã ã«æ°ããã¬ã³ãŒããå
¥åãã[ã¬ã³ãŒãã®
Create record
]ãã¯ãªãã¯ããŠãé©ãããšã§
Create record
ãŸãããä»åã¯ãããã«ã¬ã³ãŒããè¿œå ãããã¯ãªãã¯åŸã«ãã©ãŒã ã空ã«ãªããŸããã æŽæ°ãå®äºããŸããããã¡ãããããã¯ãšã³ãã¯æ°ããããŒã¿ã§ãã£ã±ãã«ãªããŸããã
Reactãšäžç·ã«å¥ã®JSãã¬ãŒã ã¯ãŒã¯ïŒããšãã°
hangar ïŒã䜿çšããŠåæ§ã®æ©èœãäœæããå ŽåãPOSTãªã¯ãšã¹ãã«Railsãå¿
èŠãšããCSRFããŒã¯ã³ãå«ãŸããŠããªããããåé¡ãçºçããå¯èœæ§ããããŸãã
jquery
ã䜿çšããŠããã¯ãšã³ããšããåãããããã
Rails jquery_ujs
æ§ãããªãã©ã€ããŒã¯ãåAJAXãªã¯ãšã¹ãã«CSRFããŒã¯ã³ãå«ããŸãã ãã£ãããã
ãã®ã»ã¯ã·ã§ã³ã§ã³ãŒãã®çµæã確èªãããã
ããã§å€æŽã確èªã§ã
ãŸããã³ã³ããŒãã³ãã®åå©çš
äžéšã®ïŒè¯ãïŒã¡ããªãã¯ããªããã°ãã¢ããªã¯äœãæã¿ãŸããïŒ ãŠã£ã³ããŠã®äžéšã«ããã€ãã®æ
å ±ã䜿çšããããã¯ã¹ãè¿œå ããŸãããã ããã¯ã¹3ã§ã¯ãã¯ã¬ãžããã®åèšæ°ãããããã®åèšæ°ãæ®é«ã®å€ã瀺ããŸãã
3ã€ã®ã³ã³ããŒãã³ãã§äœæ¥ããŠããããã«èŠããŸããããããšãèšå®ã®1ã€ã ãã§ããïŒ
ããã¹ãã®éãšã¿ã€ãã®èšå®ãåãåãæ°ãã
AmountBox
ã³ã³ããŒãã³ããäœæã§ããŸãã æ°ãããã¡ã€ã«ãäœæãããšã
javascripts/components/
ãã
amount_box.js.coffee
ãåŒã³åºããã次ã®ã³ãŒããæ¿å
¥ãããŸãã
ããŒãã¹ãã©ããããã«ã䜿çšããã ãã§ãèŠçŽ ã¯ããããã¯ãã¡ãœããã§æ
å ±ã衚瀺ããèšå®ã®çš®é¡ã«ãã£ãŠè²ãèšå®ããŸãã
ãŸããèšå®ã®æ°ãèªã¿åããé貚圢åŒã§è¡šç€ºãã
amountFormat
ãšåŒã°ãããéåžžã«ç°¡åãªåœ¢åŒã®ã¡ãœãããå«ãŸããŠããŸãã
泚æã«ã¯å®å
šãªãœãªã¥ãŒã·ã§ã³ããããŸãã 衚瀺ããããŒã¿ã«å¿ããŠå¿
èŠãªèšå®ãæž¡ãã«ã¯ãã¡ã€ã³èŠçŽ å
ã§ãã®èŠçŽ ã3åäœæããå¿
èŠããããŸãã ã¡ãœããã®èšç®æ©ãäœæããŸãããã æåã«ã
Record
ã³ã³ããŒãã³ããéãã次ã®ã¡ãœãããè¿œå ããŸãã
å€ã0ãã倧ãããã¹ãŠã®ã¬ã³ãŒãã®è²žæ¹ã®åèšãéé¡ã0ããå°ãããã¹ãŠã®ã¬ã³ãŒãã®åæ¹ãšæ®é«å€ã®åèšã ããã§ãé©åãªå Žæã«èšç®å¯èœãªã¡ãœãããã§ããŸããã å
éšã«
AmountBox
èŠçŽ ãäœæããã¡ãœããïŒ
RecordForm
ã³ã³ããŒãã³ãã®ããäžïŒãã¬ã³ããªã³ã°ããã ãã§ãã
ãã®æ©èœã¯ããã§å®äºã§ãïŒ ãã©ãŠã¶ãæŽæ°ããŸãã åã«èšç®ãã3ã€ã®ããã¯ã¹ã衚瀺ãããŠããã¯ãã§ãã ããããåŸ
ã£ãŠãã ããïŒ ãã£ãšãããŸãïŒ æ°ããã¬ã³ãŒããäœæããŠãäœåã®éæ³ãã芧ãã ããã
ã³ãŒãã®çµæãèŠãããšãã§ã
ãŸããããã§ä¿®æ£
setState / replaceStateïŒã¬ã³ãŒããåé€ããŸã
ãªã¹ãã®æ¬¡ã®æ©èœã¯ãã¬ã³ãŒãã®åé€ã§ãã ã¬ã³ãŒãããŒãã«ã«æ°ããã¢ã¯ã·ã§ã³åãå¿
èŠã§ãã ãã®åã«ã¯ããšã³ããªããšã«åé€ãã¿ã³ããããUIã®æšæºã§ãã åã®äŸã®ããã«ãRailsã³ã³ãããŒã©ã§ã¡ãœãããäœæããã³åé€ããå¿
èŠããããŸãã
ããã¯ããã®æ©èœã«å¿
èŠãªãã¹ãŠã®ãµãŒããŒåŽã³ãŒãã§ãã 次ã«ã
Records React
ã³ã³ããŒãã³ããéããã¢ã¯ã·ã§ã³ã®ããŒãã«ããããŒã®å³åŽã«åãè¿œå ããŸãã
æåŸã«ãã¬ã³ãŒãã³ã³ããŒãã³ããéãã[åé€]ãªã³ã¯ãå«ãåãè¿œå ããŸã
ãã¡ã€ã«ãä¿åãããã©ãŠã¶ãæŽæ°ãããšãã€ãã³ããæ·»ä»ãããŠããªããã¿ã³ãæ©èœããªããªããŸãã
ããã€ãã®æ©èœãè¿œå ããŸãããã ãªã¹ãã䜿çšããŠ
RecordForm
ã³ã³ããŒãã³ãããåŠãã ããã«ïŒ
- Recordã³ã³ããŒãã³ãã®åå«å
ã®ã€ãã³ããåé€ããŸãïŒonClickïŒ
- ã¢ã¯ã·ã§ã³ãå®è¡ããŸãïŒãã®å ŽåããµãŒããŒã«DELETEãªã¯ãšã¹ããéä¿¡ããŸãïŒ
- ãã®ã¢ã¯ã·ã§ã³ã®èŠªã³ã³ããŒãã³ãã®ã¬ã³ãŒãã«éç¥ããïŒèšå®ã«ãããã³ãã©ãŒã¡ãœããã®éåä¿¡ïŒ
- ã¬ã³ãŒãã³ã³ããŒãã³ãã®ç¶æ
ãæŽæ°ãã
æåã®ã¹ããããå®è£
ããããã«ãåãæ¹æ³ã§
OnClick
ãã³ãã©ãŒã
Record
ã«è¿œå ã§ã
OnClick
onSubmit
ãã³ãã©ãŒã
onSubmit
ã«
RecordForm
ããŠãæ°ããã¬ã³ãŒããäœæããŸãã 幞ããªããšã«ãReactã¯ã»ãšãã©ã®äžè¬çãªãã©ãŠã¶ãŒã€ãã³ããéåžžã®åœ¢åŒã§å®è£
ããŠããŸãã ãããã£ãŠããã©ãŠã¶éã®äºææ§ã«ã€ããŠå¿é
ããå¿
èŠã¯ãããŸããïŒã€ãã³ãã®å®å
šãªãªã¹ãã¯
ãã¡ãã§ç¢ºèªã§ããŸãïŒã
èšé²ã³ã³ããŒãã³ããå床éãã次ã®ããã«ã
handleDelete
ãªãåé€ãã¿ã³ã«æ°ãã
handleDelete
ã¡ãœãããš
OnClick
å±æ§ãè¿œå ããŸãã
åé€ãã¿ã³ãã¯ãªãã¯
handleDelete
ã¯AJAXãªã¯ãšã¹ãããµãŒããŒã«éä¿¡ããŸã
ããã¯ãšã³ãã§ã¬ã³ãŒããåé€ãããã®åŸã
handleDeleteRecord
ãä»ããŠãã®ã¢ã¯ã·ã§ã³ã«ã€ããŠèŠªã³ã³ããŒãã³ãã«éç¥ããŸããèšå®ã§ãã³ãã©ãŒã䜿çšã§ããããã芪ã³ã³ããŒãã³ãã§ã®RecordèŠçŽ ã®äœæãèŠå¶ããå¿
èŠããããŸãã
è¿œå ã®
handleDeleteRecord
ããããã£ãæå¹ã«ããç¥å
ã«å®éã®ãã³ãã©ã¡ãœãããå®è£
ããã«ã¯ïŒ
åºæ¬çã«ã
deleteRecord
ã¡ãœããã¯ãã¬ã³ãŒãã®ç¶æ
ã®çŸåšã®ã³ã³ããŒãã³ããã³ããŒããåé€ããå¿
èŠãããã¬ã³ãŒãã€ã³ããã¯ã¹ã§æ€çŽ¢ãå®è¡ããŸãã ããããæšæºã®jsæäœã
ç¶æ
ãšããåãããæ°ããæ¹æ³ãå°å
¥ããŸããããreplaceState
äž»ãªéãã¯setState
ãreplaceState
1ã€ç®ã¯ãªããžã§ã¯ãã®1ã€ã®ç¶æ
ããŒã®ã¿ãæŽæ°ãã2ã€ç®ã¯éä¿¡ããæ°ãããªããžã§ã¯ãã§ã³ã³ããŒãã³ãã®çŸåšã®ç¶æ
ãå®å
šã«åå®çŸ©ããããšã§ããã³ãŒãã®æåŸã®ããããæŽæ°ããåŸããã©ãŠã¶ãŠã£ã³ããŠãæŽæ°ããŠãšã³ããªãåé€ããããšãããšã次ã®2ã€ã®ããšãèµ·ãããŸãã- ã¬ã³ãŒããããŒãã«ããæ¶ããŸã
- ã€ã³ãã£ã±ãŒã¿ãŒã¯ããã«çªå·ãæŽæ°ããå¿
èŠããããŸãïŒããã«ä»ã®ã³ãŒãã¯å¿
èŠãããŸããïŒã
ã»ãŒå®äºããŸããããæåŸã®æ©èœãã€ã³ã¹ããŒã«ããåã«ãå°ãã®ãªãã¡ã¯ã¿ãªã³ã°ãåæã«é©çšããŠãæ°ããReacté¢æ°ãå°å
¥ã§ããŸãããªãã¡ã¯ã¿ãªã³ã°ïŒç¶æ
ãã«ããŒ
æåŸã®æ©èœãããŒãã«ã®Edit
åDelete
ãã¿ã³ã®åŸã«è¿œå ã®ãã¿ã³ãè¿œå ããŸãããã¿ã³ãã¯ãªãã¯ããEdit
ãšããŠãŒã¶ãŒãã¬ã³ãŒãã®å
容ãæŽæ°ã§ããã€ã³ã©ã€ã³ãã©ãŒã ãéããŠãè¡å
šäœãšèªã¿åãå°çšç¶æ
ãç·šéç¶æ
ã«åãæ¿ããŸããæŽæ°ãããã³ã³ãã³ããéä¿¡ããããè¡ã«å¯Ÿããã¢ã¯ã·ã§ã³ããã£ã³ã»ã«ãããšãã¬ã³ãŒãã¯å
ã®èªã¿åãå°çšç¶æ
ã«æ»ããŸããåã®ç« ããæšæž¬ããããã«ãã³ã³ããŒãã³ãå
ã®ã¬ã³ãŒãã®åç¶æ
ãåãæ¿ããããã«ãããã€ãã®ããŒã¿ãåŠçããå¿
èŠããããŸãRecord
ãããã¯ãReactããªã¢ã¯ãã£ãããŒã¿ã¹ããªãŒã ãšåŒã¶ãã®ã䜿çšããå Žåã§ããç·šéãã©ã°ãšhandleToggleã¡ãœãããrecord.js.coffeeã«è¿œå ããŸãããïŒ
ç·šéãã©ã°ã¯ããã©ã«ãã§ãªãã«ãªãhandleToggle
ãç·šéãfalseããtrueã«å€æŽããŸãããã®éãåæ§ã§ããhandleToggle
ãŠãŒã¶ãŒã§OnClick
ã€ãã³ããããªã¬ãŒããã ãã§ãã次ã«ãread / read_and_editè¡ã®2ã€ã®ããŒãžã§ã³ãå¶åŸ¡ããç·šéã«å¿ããŠæ¡ä»¶ä»ãã§è¡šç€ºããå¿
èŠããããŸãã幞ããªããšã«ãèŠèŠåã¡ãœãããReactèŠçŽ ãè¿ãéããä»»æã®ã¢ã¯ã·ã§ã³ãèªç±ã«å®è¡ã§ããŸããæã
ã¯ããã€ãã®ãã«ããŒã¡ãœãããå®çŸ©ããããšãã§ããŸãrecordRow
ããrecordForm
ãããŠå
容ã«å¿ããŠãå¯èŠåã«æ¡ä»¶ä»ãã§ããããåŒã³åºããŸã@ state.edit
ããã§ã«æåã®ãªãã·ã§ã³ãããrecordRow
ããããçŸåšã®ã¬ã³ããªã³ã°æ¹æ³ã§ããã¬ã³ããªã³ã°ã³ã³ãã³ããæ°ããã¡ãœããã«ç§»åããŸãããrecordRow
è¿œå ã®ã³ãŒããè¿œå ããŸãïŒ
äœåã«è¿œå ããŸããReact.DOM
ãèŠçŽ ã¯ããã®ã·ã°ãã«ãåŸ
ã£onClick
ãŠããŸãhandleToggle
å
ã«é²ã¿ãŸãã
å®è£
recordForm
ã¯æ¬¡ã®æ§é ã«ããå¿
èŠããããŸãããåã»ã«ã«å
¥åãã£ãŒã«ãããããŸããref
å
¥åã«æ°ããå±æ§ã䜿çšããå©çšå¯èœã«ããŸãããã®ã³ã³ããŒãã³ãã¯ç¶æ
ãåŠçããªãããããã®æ°ããå±æ§ã«ãããã³ã³ããŒãã³ãã¯ãŠãŒã¶ãŒããæäŸãããããŒã¿ãèªã¿åãããšãã§ããŸãã@refs:
å¿é
ããªãã§ã
ãã®ã¡ãœããã¯ãã£ãšå€§ãããŠãããŸããŸããããåãªãHTMLæ§æã§ããçºèšã@handleEdit
ãŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ãããšãã«åŒã³åºããUpdate
ã¬ã³ãŒããåé€ãã1ã€ã®å®è£
ãšããŠåæ§ã®ã¹ã¬ããã䜿çšããŸãããããã®äœææ¹æ³ã®éãã«æ°ã¥ããŸããReact.DOM.inputs
ãïŒdefaultValue
åæå
¥åãèšå®ãã代ããã«ããã©ã«ãã䜿çšããŸããããã¯ãå€ãªãã§ã®ã¿äœ¿çšOnChange
ãããšæçµçã«èªã¿åãå°çšå
¥åãšããŠäœæãããããã§ããæåŸã«ãèŠèŠåã¡ãœããã¯æ¬¡ã®ã³ãŒãã«èŠçŽãããŸãã
, , , .
, Rails:
,
handleEdit
, AJAX , ,
handleEditRecord
,
@props
, , :
ç°¡åã«ããããã«ããŠãŒã¶ãŒããŒã¿ããã§ãã¯ãããReact.findDOMNode
ïŒ@ refs.fieldName
ïŒ.valueãä»ããŠããããèªã¿åããããã¯ãšã³ãã«ãã®ãŸãŸéä¿¡ããŸããæåã®ããã«ç¶æ
ãæŽæ°ããŠç·šéã¢ãŒãã«åãæ¿ããããšã¯ãªãã·ã§ã³ã§ããããŠãŒã¶ãŒã¯ç¢ºãã«ãã®ããšã«æè¬ããŸããæåŸã«éèŠãªããšã§ãããã¬ã³ãŒãã³ã³ããŒãã³ãã®ç¶æ
ãæŽæ°ããŠãåã®ã¬ã³ãŒããæ°ããããŒãžã§ã³ã®ã¬ã³ãŒãã®åå«ã§äžæžãããReactã«éæ³ããããå¿
èŠããããŸããå®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
åã®ã»ã¯ã·ã§ã³ã§åŠãã React.addons.update
ããã«ãç¶æ
ã®å€æŽã䜿çšãããšãããå
·äœçãªæ¹æ³ã«ã€ãªããå¯èœæ§ããããŸããã¬ã³ãŒããšã¬ã³ãŒãéã®æåŸã®ãªã³ã¯ã¯@updateRecord
ãhandleEditRecord
èšå®ãä»ããŠæž¡ãããã¡ãœããã§ãããã©ãŠã¶ãæåŸã«æŽæ°ããŠãæ¢åã®ãšã³ããªãæŽæ°ããŠã¿ãŠãã ãããããŒãžäžéšã®ããã¯ã¹ããå€æŽãããã¹ãŠã®ãšã³ããªã远跡ããæ¹æ³ã«æ³šæããŠãã ãããã§ããŸããïŒå°ããªRails + Reactã¢ããªã±ãŒã·ã§ã³ããŒãããäœæããŸããïŒã³ãŒãã®çµæã¯ãã¡ãã§ç¢ºèªã§ããŸãããæ°ããå€æŽã¯ãã¡ãã§ããæçµçãªèãïŒReact.jsãã·ã³ãã«ããšæè»æ§
Reactã®æ©èœã®ããã€ããèŠãŠãæ°ããæŠå¿µãå°å
¥ããããšã¯ã»ãšãã©ãªãããšãåŠã³ãŸããã XãŸãã¯Yãã¬ãŒã ãèšã人ã
ã®ã³ã¡ã³ããèããŸãããJavaScriptã¯ãæ°ããå°å
¥ããããã¹ãŠã®æŠå¿µã®ããã«æ¥ãªåŠç¿æ²ç·ãæã£ãŠããŸãããããã¯Reactã®ã±ãŒã¹ã§ã¯ãããŸãããã€ãã³ããã³ãã©ãŒããã€ã³ãã£ã³ã°ãªã©ã®åºæ¬çãªJavaScriptã®æŠå¿µãå®è£
ããåŠç¿ãšç解ã容æã«ããŸããç¹°ãè¿ãã«ãªããŸããããã®é·æã®1ã€ã¯ãã®ã·ã³ãã«ãã§ãããŸããäŸãéããŠããã¢ã¯ãã£ããªäœæ¥ããšãCoffeeScriptãJQueryãTurbolinksãããã³ãã®ä»ã®ã¬ãŒã«ãšã®é£æºãã¬ãŒã«ãªãŒã±ã¹ãã©ã«çµ±åããæ¹æ³ãåŠã³ãŸããããããããããæãŸããçµæãéæããå¯äžã®æ¹æ³ã§ã¯ãããŸãããããšãã°ãTurbolinksã䜿çšããªãå ŽåïŒreact_ujsã¯äžèŠïŒãreact-reils gemã®ä»£ããã«Railsã¢ã»ããã䜿çšã§ããŸããJBuilderã䜿çšããŠãJSONãªããžã§ã¯ããã¬ã³ããªã³ã°ãã代ããã«ãããè€éãªJSONå¿çãäœæã§ããŸãããã ããåãçŽ æŽãããçµæãåŸãããšãã§ããŸãã