ç°¡åãªRailsã¢ããªã±ãŒã·ã§ã³ãå¶äœããMVCã¢ãã«ã«ããé«åºŠãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ã®ä»çµã¿ãåŠã¶ããŸãVue.jsãçšããããŒã¿ãã€ã³ãã£ã³ã°ã®ä»çµã¿ãåŠã¶ã
rbenvãã€ã³ã¹ããŒã«
# Mac
brew install rbenv
# ãã®ä»
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash
Rubyãã€ã³ã¹ããŒã«
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
rbenv install 2.6.4
RailsãšBundlerãã€ã³ã¹ããŒã«
gem install bundler
gem install rails
ããã°ã©ãã³ã°èšèªã®äžã€ãæ¥æ¬äººãäœã£ãäžã§ããããäžçäžã§æãåºã䜿ãããŠããã§ããããœãããŠã§ã¢ãPerlãPythonã®åŒ·åãªåŸæŒããåŸãŠãæºãæããŠäžã«éãåºãããã以äžã®æ§ãªç¹åŸŽãããã
- å³å¯ãã€å®å šãªãªããžã§ã¯ãæå
- è¡šçŸã®å€æ§æ§
- gemãšãã匷åãªæšæºããã±ãŒãžãããŒãžã£ãŒ
Ruby on Rails ãšããããŽã£ãŒãªããžã§ã¯ããèªçããããšã«ããäžçäžã®ãŠã§ããµãŒããŒã§åãããã°ã©ãã³ã°èšèªã«ãªã£ãŠããŸã£ãã
ããã°ã©ãã³ã°èšèªãšããŠã®åºç€çãªèšæ³ã¯ä»¥äžã®ãšããã
-
ã€ã³ãã³ãã¯æ £ç¿çã«ã¹ããŒã¹2ã€ã
-
ã»ãã³ãã³ã¯äžèŠãä»ããããšãã§ãããæ®éã¯ä»ããªãã
-
åºæ¬çãªæ§æã¯ã«ãã³ãªãã§æžãããããããã«
end
ãšããããŒã¯ãŒãã§éããå¿ èŠããããendå°çãšãåŒã°ãããif 1 == 2 puts 'What?' end for i in 1..10 puts i end
-
Rubyã®å šãŠã¯ãªããžã§ã¯ãã§ãããã¡ãœããã®åŒã³åºãã䜿ã£ãŠç°¡æœãªèšè¿°ãã§ãããäŸãã°ãã"hoge"ã倧æåã«ããŠååŸãã²ã£ããè¿ããŠæåŸã®æåãåãåã£ãæååããæ±ããããã°ã©ã ã¯æ¬¡ã®ããã«æžããã
'hoge'.upcase.reverse.chop
-
é¢æ°åŒã³åºãã®æ¬åŒ§ã¯çç¥ããããšãã§ããããã®æžãæ¹ã¯å¯èªæ§ã倱ããšããŠé¿ããããå Žåãå€ãã
puts(rand(10.gcd(15))) puts rand 10.gcd 15
-
äžéšã¡ãœããã¯
do |a, b| ~ end
ãããã¯{|a, b| ~}
ã«ãã£ãŠè¡šããããããã¯ãšããåŒæ°ããšãããšãã§ãããããã¯ãä»»æã®åŠçããè¡šçŸããã³ãŒããåãæž¡ãããæã«äœ¿ãããã10.times do |i| puts i end 10.times {|i| puts i} 0.upto(9) do |i| puts i end
-
æååãšããŒã¯ãŒãã®äžéã®ç¹åŸŽãæã€ãã·ã³ãã«ãšãããªãã©ã«ãååšããã(èªåŒãããã)ã°ããŒãã«ã«äœ¿ããenumãšã§ãæãã°ãããé£æ³é åã®ããŒãçš®é¡ãéå®ãããåŒæ°ãªã©ã«äœ¿çšãããã
hash = { :hoge => 'fuga' } # åãæå³ hash = { hoge: 'fuga' } p hash[:hoge] #=> 'fuga'
äžå®ãªäººã¯ãã®ããããèªããšããããã
- Rubyå ¬åŒãµã€ã: Rubyã¯éçºè ãæ¥æ¬äººãªã ããã£ãŠæ¥æ¬èªã®ããã¥ã¡ã³ãããã®ãããå€ããå ¬åŒãµã€ããæ¥æ¬èªã§ãããŠãã®æ å ±ãæäŸãããŠããã®ã§ããããèªãã°å€§æµãªããšããªãã
- RubyLife
- Rubyåºç€ææ³æéãã¹ã¿ãŒ
- ããã°ã©ãã³ã°çµéšããã人åãRubyãã¥ãŒããªã¢ã« - Qiita
- Rubyã¢ãœã·ãšãŒã·ã§ã³: ãã¥ãŒããªã¢ã«
Rubyã®ã¡ã¿ããã°ã©ãã³ã°ã®æè»æ§ãšMVCã¢ãã«ãšããæŠåšã«ããäžçäžã«ç¬ãéã«åºãŸã£ããŠã§ãã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ãä»ãRubyã®çšéã®åå以äžã¯ Ruby on Rails ã§ãããšãèšããããRailsãšç¥ãã
å°ããªããã°ãã倧èŠæš¡ãªSNSãŸã§ãããªãå®çšçãªãŠã§ããµã€ããæ§ç¯ã§ãããäŸãã°ä»¥äžã®ãµã€ãã¯Railsã§æ§ç¯ãããŠããã
åè: åœå 泚ç®ã®WebãµãŒãã¹ãæ¯ããèšèªã»ãã¬ãŒã ã¯ãŒã¯ã»ã¢ãŒããã¯ãã£äžèŠ§ã2013幎çã, ããªãã«ãäœããïŒRuby on Railsã§äœãããWebãµãŒãã¹5éžïŒ, 37 Sites You LOVE Built With Ruby On Rails
ãããããå®ããããäœæ³ã«åŸã£ãŠããã°ã©ã ãèšè¿°ããããšã«ãã£ãŠããŠã§ãã¢ããªã±ãŒã·ã§ã³ã®å¶äœãç°¡åãã€æ§é çã«è¡ãããšãã§ããããã°ã©ã ã®æ çµã¿ã®ããšã
ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã»ãã¬ãŒã ã¯ãŒã¯ã®äŸ:
- Ruby on Rails (Ruby)
- CakePHP (PHP)
- Laravel (PHP)
- Zend (PHP)
- Django (Python)
- Sails (JavaScript)
- TreeFrog (C++)
è€éåããã¡ãªWebã¢ããªã±ãŒã·ã§ã³éçºã«ãããŠããããã®ãã¬ãŒã ã¯ãŒã¯ã®åœ¹å²ã®ã²ãšã€ã¯ããã ããã°ã©ãã«ç¡ç§©åºã«ããã°ã©ã ãæžãããããšã§ã¯ãªããäžå®ã®èšèšèŠåã«åã£ãŠWebã¢ããªã±ãŒã·ã§ã³ãèšè¿°ãããããšã«ããããã®ãããªã¢ããªã±ãŒã·ã§ã³ãèšè¿°ããäžã§ã®èšèšèŠåã»èšèšæ¹éã®ããšããœãããŠã§ã¢ã¢ãŒããã¯ãã£ãã¿ãŒã³ãšããã¶ã€ã³ãã¿ãŒã³ãšãèªãã ãããã
åããã¶ã€ã³ãã¿ãŒã³ãæ¡çšããŠããã¢ããªã±ãŒã·ã§ã³ã¯ããã®ãã¿ãŒã³ãæç«ãããããã®å ±éã®åŠçãå«ãããšãå€ããããããšã¯éã«ãåã ã®ã¢ããªã±ãŒã·ã§ã³åºæã®ããã®ã¢ããªã±ãŒã·ã§ã³ã§å®çŸãããæ©èœã»åŠçããå«ãŸããããã®ãããªåŠçã®ããšãããžãã¹ããžãã¯ãšåŒã¶ã
Webã¢ããªã±ãŒã·ã§ã³ãéçºããäžã§é£ããã®ã¯ããã®ãããªãã¬ãŒã ã¯ãŒã¯ããã¶ã€ã³ãã¿ãŒã³ã«äœãéžæãããããããŠå®çŸãããããžãã¹ããžãã¯ããã®ãã¿ãŒã³ã®äžã«ã©ã®ããã«ä¹ãããããšããããšã§ããã
ãã¶ã€ã³ãã¿ãŒã³ã«ã¯æŽå²çãªãã®ãå«ããŠéåžžã«å€ãã®çš®é¡ãç¥ãããŠãããããã®äžã§ãç¹ã«ãµãŒããŒãµã€ãã§æ¡çšãããããšãå€ããã¿ãŒã³ãMVCãã¿ãŒã³ã§ãããRuby on Rails ãæ¡çšããŠãããã¶ã€ã³ãã¿ãŒã³ã§ããããModel-View-Controller ã®ç¥ããã®åã®éããModelãšViewãšControllerãšãã3çš®é¡ã®èŠçŽ ã§ã¢ããªã±ãŒã·ã§ã³ãæ§æããã
以äžã§ã¯ç¹ã«Railsã«ãããMVCã«ã€ããŠè§£èª¬ããã
- Model: ã¢ããªã±ãŒã·ã§ã³ãæ±ããã¢ããããã³ãããšãããã«å¯Ÿããæäœãè¡šçŸãããã®ãå žåçãªèšèšã§ã¯ããŒã¿ããŒã¹ã®ããŒãã«ãšåãæ°ã ãååšããã
- Controller: å ¥å(HTTPãªã¯ãšã¹ã)ãåãåããããã«å¯ŸããŠå¿ èŠãªæäœãModelãéããŠå®è¡ãããã®çµæãViewã«æž¡ãã
- View: Controllerããæž¡ãããçµæãããšã«åºå(HTML)ãçæããã
æç« ã§ãããããããªãã®ã§ãå 人ãäœã£ãã€ã©ã¹ããããã€ãåç §ããã
ããå°ã詳ããæžããšãããªæãã«ãªããšæãã
ãã®ããã«MVCã¢ãã«ã§ã¯ModelãšViewãšControllerãååã«æãããããšãå€ãããããšRailsã«ãããModelã¯æããã«ViewãControllerãšã¬ã€ã€ãŒãç°ãªããModelã¯ããŒã¿ããŒã¹ã«ãããããŒãã«ãã©ããã³ã°ããããã«ä»éããæäœããã¡ã€ã³ããžãã¯ãå å ããæœè±¡çãªã¯ã©ã¹ãšãã®ã€ã³ã¹ã¿ã³ã¹ã§ãããããã©ãŠã¶âControllerâViewâãã©ãŠã¶ããšããããŒã¿ã®æµããšã¯äžç·ãç»ããŠãããModelã®æäœã¯Controllerããè¡ãã®ãæãŸããããControllerããç¢å°ãåŒãããããã¢ããªã±ãŒã·ã§ã³ã®äžéšãšããŠä»ãšã¯ç¬ç«ããæŠå¿µãªã®ã§ãå®ã¯ã¢ããªã±ãŒã·ã§ã³ã®ã©ãããã§ãå©çšããããšãã§ããã
ãŸãã¯ã¢ããªã±ãŒã·ã§ã³ã® /
(ã«ãŒããã¹)ã«ã¢ã¯ã»ã¹ããã âHello, World!â ãšè¡šç€ºããããã°ã©ã ãäœãã
ã¿ãŒããã«ããé©åœãªäœæ¥çšãã©ã«ãã«è¡ãã
rails new hello
ãšæã¡èŸŒããšããã« hello
ãšãããã©ã«ããäœããããã®äžã«ç¹ã«äœããªã空ã£ãœã®Railsã¢ããªã±ãŒã·ã§ã³ãçæããããappãã£ã¬ã¯ããªã®äžã«modelãšãviewãšãcontrollerã¿ãããªãã£ã¬ã¯ããªãããã®ããããã
ãã®ç¶æ ã§ããèµ·åããããšãã§ããããŸãã¯ãµãŒããŒèµ·åããŠã¢ã¯ã»ã¹ããŠã¿ãã
cd hello
bundle exec rails server
ããã©ã«ãã ãšlocalhostã®3000çªããŒãã«RailsãµãŒããŒãç«ã¡äžããããã©ãŠã¶ãã http://localhost:3000/ ã«ã¢ã¯ã»ã¹ãããšãWelcome aboard ãšããããªããšãæžãããããŒãžãçŸãããšæãã
ãã®æç¹ã§äœãééããŠãæ»ãããšãã§ããããã«Gitãªããžããªã«ããŠããããšãããããããã
git init
git add --all
git commit -m "Initial commit"
ãŸãã¯Helloãšããååã®Controllerãäœã£ãŠã¿ãã
bundle exec rails generate controller Hello
ããã«ããHelloãšãã空ã£ãœã®Controllerãšããã«ä»éãããããããªãã®ãäžæ°ã«çæãããã
Controlleræ¬äœã¯ app/controllers/hello_controller.rb
ã«çœ®ããŠããããããéããŠã以äžã®ããã«ç·šéããã
class HelloController < ApplicationController
def show
@message = 'Hello, World!'
end
end
次ã«ãã®ControllerããããŒã¿ãæž¡ãããViewãäœæãããapp/views/hello/show.html.erb
ãšããããã¹ããã¡ã€ã«ãäœæãã次ã®ããã«èšè¿°ããã
<h1><%= @message %></h1>
ERBã¯ãã³ãã¬ãŒããšã³ãžã³ã®1ã€ã§ãããPHPãšäŒŒããããªãã®ã ãšæã£ãŠããã
æåŸã« /
ãããã®HelloãšããControllerã«ã¢ã¯ã»ã¹ãå±ãããã«ã«ãŒã¿ãŒã®èšå®ãå€æŽãããconfig/routes.rb
ãéãã
ã³ã¡ã³ãã倧éã«æžããŠããããæ£çŽãããªãã®ã§ããã£ãšåé€ããŠä»¥äžã®ããã«æžãã
Rails.application.routes.draw do
root 'hello#show'
end
ããã§ããã©ãŠã¶âroutes.rbâControllerâViewâãã©ãŠã¶ããšããäžé£ã®ããŒã¿ã®æµããå®æãããåã³RailsãµãŒããŒãèµ·åããã
(ãµãŒããŒã䌎ããŠã§ãã¢ããªã±ãŒã·ã§ã³ã¯æ®éCGIãšç°ãªãã¢ã¯ã»ã¹ããšã«ããã°ã©ã ãã¡ã€ã«ã®å 容ãèªã¿ããã ãããªãã®ã§ãããã°ã©ã ãå€æŽãããåèµ·åããå¿ èŠãããããã ãRailsã®ControllerãViewã®å Žåã¯äŸå€)
bundle exec rails server
http://localhost:3000 ã«ã¢ã¯ã»ã¹ãããHello, World!ããšè¡šç€ºããããæåã
åã åã®PHPå®ç¿ãšåãããRubyã®ç·Žç¿ãå ŒããŠæ¥ä»ããææ¥ãèšç®ãããµã€ããäœããã
ãŸãã¯Helloã³ã³ãããŒã©ãŒã«show_daysãšcalc_daysãšããã¡ãœãããäœãã(ããã¯èšèšäžéåžžã«è¯ããªããä»åã¯å®ç¿ãªã®ã§ä»æ¹ãªã)
class HelloController < ApplicationController
def show
@message = 'Hello, World!'
end
def show_days
render action: 'days'
end
def calc_days
@year = params[:year].to_i
@month = params[:month].to_i
@day = params[:day].to_i
# ããã«äœãæžã
@day_in_week = 'hogeææ¥'
render action: 'days'
end
end
次㫠app/views/hello/days.html.erb
ãšããããã¹ããã¡ã€ã«ãäœæãã次ã®ããã«æžãã
<h1>ææ¥èšç®æ©</h1>
<% unless @day_in_week.nil? %>
<p>
<%= @year %>幎<%= @month %>æ<%= @day %>æ¥ã¯<%= @day_in_week %>ã§ãã
</p>
<% end %>
<p>æ¥ä»ãå
¥åããŠãã ãã</p>
<%= form_tag do %>
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
<%= text_field_tag :year %>幎
<%= text_field_tag :month %>æ
<%= text_field_tag :day %>æ¥
<%= submit_tag 'éä¿¡' %>
<% end %>
æåŸã« config/routes.rb
ã次ã®ããã«å€æŽããã
Rails.application.routes.draw do
root 'hello#show'
get '/days', to: 'hello#show_days'
post '/days', to: 'hello#calc_days'
end
Railsãåèµ·åããŠã http://localhost:3000/days ã«ã¢ã¯ã»ã¹ããããææ¥èšç®æ©ããªãç»é¢ã衚瀺ããããOKã
gemã«ã€ããŠç¹ã«èª¬æããŠãªããã奜ããªgemã䜿ã£ãŠè¯ãã
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
source ~/.bashrc
nvm install node
ããã°ã©ãã³ã°èšèªãšããŠã¯ãJavaScriptã«ã¯ä»¥äžã®ãããªç¹åŸŽãããã
- 匷ãåçåä»ãèšèª
- 軜快ãã€é«æ©èœãªé¢æ°åŠç
- ããã«äŒŽãéåæåŠçã®å®¹æã
- ãããã¿ã€ã (oræ¬äŒŒã¯ã©ã¹) ããŒã¹ã®ãªããžã§ã¯ãæå
äžã§è¿°ã¹ããšããæè¿ã®JavaScriptã¯è²ããªæã§åãã®ã§ãèšèªä»æ§ãšAPIã¯å³å¯ã«åºå¥ããŠèããå¿
èŠããããäŸãã°ãHello, World! ã®ãšããã§äœ¿çšãã document.write
, alert
, console.log
ãšãã£ãé¢æ°ã¯ãã¹ãŠ Web API ã®é¢æ°ã§ãããJavaScriptã®ä»æ§ã§ã¯ãªãã
åºæ¬çãªèšæ³ã¯ä»¥äžã®ãšããã
-
èšæ³ã¯Cèšèªã«å€§ããªåœ±é¿ãåããŠããã
if
,while
,for
ãªã©ã¯Cãšåã圢ã®æ§æã䜿çšã§ãããif (true) { console.log('true is true'); } while (true) { console.log('infinite loop'); } for (const i of [1, 3, 5, 7]) { console.log(i); }
-
ã»ãã³ãã³ã¯Rubyãšåãã§ååä»»æã¿ãããªãã®ã ããRubyãšéã£ãŠã€ããããšã®ã»ããå€ãã
-
å€æ°å®£èšãå¿ èŠãååãšããŠ
let
,const
(ãããã¯ã¹ã³ãŒã)ãçšãããlet hoge = 10; { let hoge = 24; } console.log(hoge);
-
Rubyãšåããã ãããå šéšãªããžã§ã¯ããªã®ã§ã以äžã®ããã«æžããã
[3, 1, 4].concat([1, 5]).sort().reverse().slice(0, 3);
-
é¢æ°ã¯ãES5ã§ã¯
function (a, b) {...}
ãES6ã§ã¯(a, b) => {...}
ãšæžãããçµã¿èŸŒã¿ãªããžã§ã¯ãã®ã¡ãœãããçšããŠé¢æ°åèšèªã«è¿ãæžãæ¹ãã§ãããconst f = (number) => { console.log(number * 100); }; f(2525); setTimeout(() => { console.log('hogehoge'); }, 3000); [3, 1, 4, 1, 5].map((n) => n - 2).filter((n) => n > 0).sort((a, b) => b - a).reduce((a, b) => a + b);
-
å€æ°åã¯ãããšèªç±ã«ã€ããããšãã§ãã(æ¥æ¬èªãOK)ããæåãšããŠcamelCaseã§æžãã®ãæ®éã§ããã
const theAnswerToTheUltimateQuestionOfLife = 42;
ãã©ãŠã¶ã§è¡šç€ºãããããŒãžã¯åºæ¬çã«HTMLã§ãããJavaScriptã¯HTMLãããåŒã³åºãããã圢ã§å®è¡ãããã
HTMLã¯<html>
ãã</html>
ãŸã§ã§äžã€ã®ææžãè¡šãããå®éã«è¡šç€ºãããéã«ã¯HTMLãã¡ã€ã«ãäžããèªã¿èŸŒãã§ãããé çªã«èŠã€ãã£ãèŠçŽ ãããŒãžã«æŸã蟌ãã§ãã£ãŠãããšèããŠè¯ããJavaScriptã¯<script>
ãšããèŠçŽ ã«ãã£ãŠè¡šçŸãããscriptèŠçŽ ãèŠã€ãã£ããã®æç¹ã§å®è¡ãããããªã®ã§scriptãæåã«å®è¡ããã段éã§ã¯ããã®åŸã«èšè¿°ããèŠçŽ ã¯ååšããªãã®ãšåãã§ããã
scriptèŠçŽ ã®äœ¿ãæ¹ã«ã¯äºéãããã
ã€ã³ã©ã€ã³JavaScript:
<script>
console.log('hogehoge');
</script>
å€éšJavaScript:
<script src="hoge.js"></script>
ãã©ãŠã¶äžã§å®è¡ãããJavaScriptã¯ãWeb APIã«ã¢ã¯ã»ã¹ããããšãã§ãããã©ãŠã¶ã®è²ã ãªæ©èœã䜿ãããšãã§ãããäŸãã°ã
- èŠçŽ ãäœã£ããæ¶ããããã
- èŠçŽ ã®CSSãç·šéãããã ãããã ããåããããè²ãå€ããããã
- å€éšã®ãŠã§ããµã€ããšéä¿¡ãè¡ã
- ãã©ãŠã¶ã«ä¿åãããŠããCookieãWebStorageãªã©ã«ã¢ã¯ã»ã¹ãã
- ã¹ããã®äœçœ®æ å ±ãååŸãã
ç¹ã«HTMLäžã®èŠçŽ ã«ã¢ã¯ã»ã¹ããAPIã¯DOM(Document Object Model)ãšåŒã°ããå€ãã®ãã©ãŠã¶ã§å©çšã§ããã
JavaScriptã®APIã®ç¹åŸŽãšããŠãJavaScriptã®éåæåŠçã®å®¹æããçãããã€ãã³ããšåŒã°ããä»çµã¿ã§åäœãããã®ãå€ãã
ãããªããžã§ã¯ãã«å¯ŸããŠäœããèµ·ããæã«ããåŠçãå®è¡ããããæã«ã¯ãããã°ã©ã ã¯ãã®ã€ãã³ãã«å¯ŸããŠãªã¹ããŒãè¿œå ããããããŠå®éã«äœããèµ·ããæã«ã¯ãAPIåŽã¯ãã®ã€ãã³ããçºç«ããã€ãã³ãã«è¿œå ãããŠãããªã¹ããŒãå®è¡ããã
äŸãã°ãWeb API ã§ããèŠçŽ ãã¯ãªãã¯ãããéã«ãã®X座æšã衚瀺ããã«ã¯ã以äžã®ããã«ããã
element.addEventListener('click', (event) => {
console.log(event.x);
});
// 以äžã§ãåã
element.onclick = (event) => {
console.log(event.x);
};
ãã®ããã«ã€ãã³ãã軞ã«ããŠèšè¿°ããããã°ã©ãã³ã°ããJavaScriptã«éããã€ãã³ãé§åããã°ã©ãã³ã°ãšåŒã¶ã
Vue.jsã¯ããã³ããšã³ãåŽã®UIãå®è£ ããããã®JavaScriptã©ã€ãã©ãªã§ãããä»®æ³DOMã®ä»çµã¿ãçšããŠããŒã¿ãã€ã³ãã£ã³ã°ã«ãããªã¢ã¯ãã£ãããã°ã©ãã³ã°ãå®çŸããUIã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ã§ãããããã ãã ãšäœãäœã ãåãããªããããŸãã¯ããŒã¿ãã€ã³ãã£ã³ã°ãšã¯ã©ãããæŠå¿µãªã®ãç解ããŠãããã
äŸãã°ã以äžã®ãããªã¹ããããŠã©ããã衚瀺ããJavaScriptã¢ããªã±ãŒã·ã§ã³ãå®è£ ãããšããã
<div id="app">
<div class="timer">ããš60ç§</div>
<button class="start" type="button">Start</button>
</div>
<script>
const app = document.getElementById('app');
const timer = app.querySelector('.timer');
const start = app.querySelector('.start');
let remaining = 60;
const clickStart = () => {
remaining = 60;
timer.textContent = `ããš${remaining}ç§`;
setInterval(() => {
handleTick();
}, 1000);
};
const handleTick = () => {
remaining--;
timer.textContent = `ããš${remaining}ç§`;
if (remaining < 0) {
timer.textContent = 'çµäº!';
}
};
start.onclick = clickStart;
</script>
ãã¬ãŒã ã¯ãŒã¯ã䜿çšããªãçã®JavaScriptã§ããã°æ¯èŒç劥åœãªå®è£ ã ãšæããããã®å®è£ ã«ã¯ç ©éãªç®æããããäžã€ã¯è¡šç€ºãããå€ãå€æŽããããã«è€é㪠DOM API ãåŒã³åºããŠæŽæ°ããèŠçŽ ãååŸããªããšãããªãããšãããäžã€ã¯å éšçãªç¶æ (remaining) ãå€åãããã³ã«èªåã§è¡šç€ºããå€ãæŽæ°ããªããšãããªãããšã§ããã
ãã®ãããªèšèšã ãšãã©ã®å€æ°ãUIã®ã©ã®éšåã«å¯Ÿå¿ããŠããããšããã®ãé ã®äžã§å¯Ÿå¿ä»ããŠå®è£ ããªããšãããªãããå€æ°ãå€æŽããããã³ã«UIã®æŽæ°åŠçãèªåã§èšè¿°ããªããšãããªããå€æŽæŒãããã£ãŠãæ°ã¥ãã«ãããããã°ãåã蟌ã¿ãããããã®ãããªUIã®ããã°ã©ãã³ã°ç¹æã®ç ©éãã«å¯ŸåŠããããã«ã人é¡ã¯å€ãã®ãã¶ã€ã³ãã¿ãŒã³ãçã¿åºããŠãããããããã®æ ¹æ¬ãšãªã£ãŠããæŠå¿µãããŒã¿ãã€ã³ãã£ã³ã°ã§ããã
ããŒã¿ãã€ã³ãã£ã³ã°ã¯ãããã°ã©ã ã®å éšçãªç¶æ (äžã®äŸã ãšremaining) ããUIã®ã©ã®éšå (äžã®äŸã ãštimerèŠçŽ ) ã«å¯Ÿå¿ã¥ããŠããã®ããèšè¿°ããããšã«ãã£ãŠUIãèšè¿°ããç¶æ ãšUIãåæãããä»çµã¿ã¯ã©ã€ãã©ãªåŽã§åžåãããšããææ³ã§ããã
äžã®ããã°ã©ã ã¯ãVue.js颚ã«èšè¿°ãããšä»¥äžã®ããã«ãªãã
<template>
<div id="app">
<div v-if="remaining >= 0">ããš{{remaining}}ç§</div>
<div v-else>çµäº!</div>
<button type="button" @click="clickStart">Start</button>
</div>
</template>
<script>
export default {
data() {
return {
remaining: 60,
};
},
methods: {
clickStart() {
this.remaining = 60;
setInterval(() => {
this.handleTick();
}, 1000);
},
handleTick() {
this.remaining--;
},
},
}
</script>
衚瀺ã®æŽæ°ãããããã°ã©ã ããã£ããæ¶ããŠããããšãããããdataã¡ãœããã®äžã§remainingãªãã¹ããŒããå®çŸ©ããããšã«ãããremainingå€æ°ãVue.jsã«ãã£ãŠç®¡çãããå€æ°ãšãªããå€æ°ã«å¯Ÿããå€æŽãéäžç£èŠããããtemplateã«åã蟌ãã {{remaining}}
ãªãéšåã¯å®éã«è¡šç€ºãããéã«ã¯remainingå€æ°ã®å€ã衚瀺ãããå€ãæŽæ°ããããã³ã«èªåçã«è¡šç€ºãæŽæ°ãããããã®ããã«ãããŒã¿ãã€ã³ãã£ã³ã°ãçšããããšã§ãUIã¢ããªã±ãŒã·ã§ã³ã®èšè¿°ãç°¡æœãã€ããããããèšè¿°ããããšãã§ããã
Vue.jsã«ã¯ä»ã«ãä»®æ³DOMãã³ã³ããŒãã³ãåãªã©ãããŸããŸãªéèŠãªæŠå¿µãååšãããããŸãã¯ãã®1çªåºç€çãªããŒã¿ãã€ã³ãã£ã³ã°ã®ä»çµã¿ã«æ £ã芪ããã§ãããã
äžã®<template>
ã䜿ã£ãèšæ³ã¯äžäœåããVueã³ã³ããŒãã³ãã®èšæ³ã ããVue.jsãæ°è»œã«å©çšããããã«CDNã®vue.jsãå©çšããHTMLèšæ³ãå©çšããããšãããããããã
app/views/hello/show.html.erb
ã以äžã®ããã«æžãæãããšããHello, World!ããšè¡šç€ºãããã¯ãã
<div id="app" class="content">
<div>{{hello}}</div>
</div>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data() {
return {
hello: 'Hello, World!',
};
},
computed: {
},
methods: {
},
});
</script>
ããã«å¥œããªã¢ããªã±ãŒã·ã§ã³ãæžããŠã¿ããã
äœãæãã€ããªã人ã¯ãâã«åå€åžãå転寿åžã·ãã¥ã¬ãŒã¿ãŒã®ãã³ãã¬ãŒããæžããã®ã§ããããæ¹åããŠã¿ããã
- ãã¿ã³ãæŒããšå転é床ãäžãã/äžãã
- åãæåãå€ãã
- ã¬ã€ã¢ãŠããå€ãã
- RailsãµãŒããŒãšéä¿¡ããŠå転é床ãã¿ããªã§å
±æãã
- éä¿¡ã®ä»æ¹ã¯fetchãšãã§ã°ã°ãã
app/assets/stylesheets/application.css
:
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
app/views/hello/show.html.erb
:
<div id="app" class="content">
<div :style="{
animation: `${10}s infinite linear rotate`,
display: 'inline-block',
fontSize: '20rem',
}">
{{text}}
</div>
<button type="button" @click="onClick">ããããŸãã</button>
</div>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data() {
return {
text: 'ð£',
speed: 1,
};
},
computed: {
},
methods: {
onClick() {
// ããã«ã¯ãªãã¯ããããšãã®åŠçãæžã
},
},
});
</script>