рд░реЗрд▓ 3 рдФрд░ рд╕реНрдкреНрд░рд╛рдЙрдЯрдХреЛрд░

рдирдорд╕реНрддреЗ! рд╕реНрдкреНрд░рд╛рдЙрдЯрдХреЛрд░ рдирд╛рдордХ рдПрдХ рдРрд╕реА рдЕрджреНрднреБрдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░реВрдкрд░реЗрдЦрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк рдбреЗрд╕реНрдХрдЯреЙрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрдорд╛рди рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╛рдд рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Apple рджреНрд╡рд╛рд░рд╛ iWork.com рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рд╣рдо рд╕реНрдкреНрд░рд╛рдЙрдЯрдХреЛрд░ рдХреЛ рдЕрдВрддрд┐рдо рд░реЗрд▓ рддрдХ рдмрд╛рдВрдзрддреЗ рд╣реИрдВред

рдмреЗрд╢рдХ, рдкрд╣рд▓реЗ рд╣рдо рдЕрдВрдХреБрд░ рдХреЗ рд╕рд╛рде рдордгрд┐ рдбрд╛рд▓реЗрдВрдЧреЗ:
sudo gem install sproutcore

рд╡реИрд╕реЗ, RubyGems рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрдо рд╕реЗ рдХрдо 1.2 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ:
sudo gem update --system

рдареАрдХ рд╣реИ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣реАрдо рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдЕрдм SproutCore рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ:
sc-init hello_sp
cd hello_sp
sc-server

рдлрд┐рд░ рд╣рдо рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ: 4020 рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рд╕рд╛рд░реА рдЦреБрд╢реА рдХреЛ рд░реЗрд▓ рдореЗрдВ рдмрд┐рдЦреЗрд░ рджреЗрдВрдЧреЗред
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ рдПрдХ рдЯреВрдбреЛ рд░реЗрд╕реНрдЯрдлреБрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреБрдЫ рднреА рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рджреЛрд╣рд░рд╛рдПрдВрдЧреЗ:

рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдБ:
$ rails new todos
$ cd todos

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдмрдирд╛рдиреЗ рдФрд░ рднрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдордЪрд╛рди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рддреНрд╡рд░рд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
rails g scaffold Task description:string isDone:boolean order:integer

рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
rake db:migrate

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдорд╛рдирдХ CRUD рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдереЛрдбрд╝рд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдирд┐рдпрдВрддреНрд░рдХ / рдХрд╛рд░реНрдп_controllers.rb рд▓рд╛рдПрдВ:
 class TasksController < ApplicationController respond_to :json def index respond_with(@tasks = Task.all) end def show respond_with(@task = Task.find(params[:id])) end def create respond_with(@task = Task.create(:description => params[:description], :isDone => params[:isDone], :order => params[:order])) end def update @task = Task.find(params[:id]) @task.description = params[:description] @task.isDone = params[:isDone] @task.order = params[:order] @task.save respond_with(@task) end def destroy @task = Task.find(params[:id]) @task.destroy render(:nothing => true, :status => :ok) end end 

рдмрдврд╝рд┐рдпрд╛, рдЕрдЧрд▓рд╛ рдХрджрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдЖрдмрд╛рдж рдХрд░рдирд╛ рд╣реИред рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдореЗрдВ рд╕реЗ рдПрдХ db / seeds.rb рднрд░рдирд╛ рд╣реИ:
  Task.create(:description => 'This is the first task', :isDone => true, :order => 1) Task.create(:description => 'This is the second task', :isDone => false, :order => 2) Task.create(:description => 'This is the third task', :isDone => true, :order => 3) 

рд╣рд╛рд▓рд╛рдВрдХрд┐ (рдпрджрд┐ рдХреБрдЫ рдорд╛рди рд╣реИрдВ), рддреЛ рдЖрдк рд╕реАрдзреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рднреА рдбреНрд░рд╛рдЗрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: rails c рдФрд░ рдЖрдЧреЗред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рднрд░реЗрдВ:
rake db:seed

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░реЗрд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд▓рдЧрднрдЧ рддреИрдпрд╛рд░ рд╣реИ, рдпрд╣ protect_from_forgery рд╕реЗ protect_from_forgery рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рднрдпрд╛рдирдХ "InvalidAuthenticityToken рддреНрд░реБрдЯрд┐" рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╢реБрд░реВ:
rails s

рдЗрд╕ рд▓рд┐рдВрдХ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдкрд╛рда рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕реНрдкреНрд░рд╛рдЙрдЯрдХреЛрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдпрд╣ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдЖрдкрдХреЛ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд╣реА рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдиреБрдЕрд▓ рдПрдХ рднрд╛рд░реА рдХрдХреНрд╖рд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдиреЗ рдЕрдзрд┐рдХ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рд╕реБрдЭрд╛рдпрд╛ рд╣реИред
рддреЛ, рдЪрд▓рд┐рдП рд╣рдорд╛рд░реЗ ActiveRecord рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ :: рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдмреЗрд╕, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
 class Task < ActiveRecord::Base def as_json(options = {}) ret = { :guid => "/tasks/#{self.id}", :id => self.id, :description => self.description, :isDone => self.isDone } end end 

рддрджрдиреБрд╕рд╛рд░, рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 store.loadRecords(Todos.Task, response.get('body')); 


рдпрд╣ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ buildfile рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:
 proxy "/tasks", :to => "localhost:3000" 


рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕реНрдкреНрд░рд╛рдЙрдЯрдХреЛрд░ рдкрд░ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рд▓реЗрдЦ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд░реВрдкрд░реЗрдЦрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрдерд▓
рдбреЗрдореЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЕрдзрд┐рдХ
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдХреА
Vimeo рдкрд░ рд╕рдмрдЬ рд╡реАрдбрд┐рдпреЛ рдПрд▓реНрдмрдо

Source: https://habr.com/ru/post/In116288/


All Articles