• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Ruby/Rails
 

Ruby/Rails

on

  • 3,091 views

Моята презентация на тема Ruby/Rails за VarnaLab на

Моята презентация на тема Ruby/Rails за VarnaLab на

Statistics

Views

Total Views
3,091
Views on SlideShare
1,417
Embed Views
1,674

Actions

Likes
2
Downloads
14
Comments
0

6 Embeds 1,674

http://blog.rstankov.com 1666
http://webcache.googleusercontent.com 3
http://www.hanrss.com 2
http://feeds.feedburner.com 1
http://twitter.com 1
http://translate.googleusercontent.com 1

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • Ruby е интерпретируем, интерактивен, обектно-ориентиран език за програмиране. Той комбинира черти от много други езици, сред които Smalltalk, Perl, Lisp и Python.\n\n
  • Той е framework за уеб приложения. Чиято цел е да улесни и ускори начина на разработване на уеб приложения.\n\n
  • Той е създаден от японеца Юкихиро Мацумото „Мац“. Като през 1995 излиза първата версия на езика.  Мотото на езика е  „Оптимизиран за щастието на програмиста”\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • \n
  • \n
  • \n
  • \n
  • Разработен от David Heinemeier Hansson от 37 Signals. Като е Rails е бил извлечен от тяхното приложение Basecamp. В разработаката на Rails са участвали над 1500 човека към момента.\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • Rails използва Model-View-Controller архитектура. Чиято основна цел е разделянето на бизнес логиката от потребителския интерфейс. По този начин кода е по-лесен за тестване, поддръжка и бъдеща разработка.\nModel - “обединява бизнес логиката и инфраструктурата на приложението. Като най-често се използват ActiveRecord обекти, чрез които се взаимодейства с базата от данни. В Rails  почти никога не се работи директно с базата от дани и с sql код, а се минава през ActiveRecord моделите”\nView - “представлява потребителския интерфейс. Това най-често е HTML кода”.\nController - “свързва моделите и изгледите и връща резултат на потребителя”.\n \n\n
  • Как работи едно Rails приложение? \nПри пристигане на запитване от browser-а.  Първо се минава през Routing системата, която определя, кой контролер е отговорен за обработката на запитването. След това съответния контролер взаимодейства с бизнес моделите.\nКоито са най-често са ActiveRecord обекти, които си взаимодействат с базата от данни. \nСлед това контролера предава моделите на View Layer-a, който генерира и изпраща отговор на браузъра. Като този отговор може да е html, xml, json, JavaScript или друг код.\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Taskar e разработен чрез  Тest Driven Development методологията, чиято основна идея е да се пише код в 3 стъпки:\nПърво се добавя тест, за все още не съществуващ код. Който трябва да се маркира като не успешен\nСлед това се пише възможно най-простия код, с който теста минава успешно.\nНакрая се правят подобрения по кода, изчистват се повторения, добавят се нови тестове и други.\n\nКато тези 3 стъпки се повтарят непрекъснато в процеса на разработка. Като цяло този метод на работа гарантира че 100% от кода ще е покрит с автоматични тестове. Което го прави лесен за поддръжка и с по--добър дизайн.  Това още се нарича Red-Green-Blue начин на работа.\n \n\n
  • Taskar e разработен чрез  Тest Driven Development методологията, чиято основна идея е да се пише код в 3 стъпки:\nПърво се добавя тест, за все още не съществуващ код. Който трябва да се маркира като не успешен\nСлед това се пише възможно най-простия код, с който теста минава успешно.\nНакрая се правят подобрения по кода, изчистват се повторения, добавят се нови тестове и други.\n\nКато тези 3 стъпки се повтарят непрекъснато в процеса на разработка. Като цяло този метод на работа гарантира че 100% от кода ще е покрит с автоматични тестове. Което го прави лесен за поддръжка и с по--добър дизайн.  Това още се нарича Red-Green-Blue начин на работа.\n \n\n
  • Taskar e разработен чрез  Тest Driven Development методологията, чиято основна идея е да се пише код в 3 стъпки:\nПърво се добавя тест, за все още не съществуващ код. Който трябва да се маркира като не успешен\nСлед това се пише възможно най-простия код, с който теста минава успешно.\nНакрая се правят подобрения по кода, изчистват се повторения, добавят се нови тестове и други.\n\nКато тези 3 стъпки се повтарят непрекъснато в процеса на разработка. Като цяло този метод на работа гарантира че 100% от кода ще е покрит с автоматични тестове. Което го прави лесен за поддръжка и с по--добър дизайн.  Това още се нарича Red-Green-Blue начин на работа.\n \n\n
  • Taskar e разработен чрез  Тest Driven Development методологията, чиято основна идея е да се пише код в 3 стъпки:\nПърво се добавя тест, за все още не съществуващ код. Който трябва да се маркира като не успешен\nСлед това се пише възможно най-простия код, с който теста минава успешно.\nНакрая се правят подобрения по кода, изчистват се повторения, добавят се нови тестове и други.\n\nКато тези 3 стъпки се повтарят непрекъснато в процеса на разработка. Като цяло този метод на работа гарантира че 100% от кода ще е покрит с автоматични тестове. Което го прави лесен за поддръжка и с по--добър дизайн.  Това още се нарича Red-Green-Blue начин на работа.\n \n\n
  • \n
  • \n
  • \n
  • \n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\n\nНякои от най-важните характеристики на езика са: \nдимично определяне на типа данните\nмодули - “възможност един модул да се вгражда в множество класове, като така се постига множествено наследяване”\nотворени класове - “към всеки клас могат да се добавят нови атрибути и методи по време на изпълнение на програмата”\nблокове\nанонимни функции\nвсяка операция връща резултат\nвсичко е изпълним код - “включително и телата на класовете в който може има цикли, условни оператори и други”\nизчистен синтаксис - “не е задължително, да се поставят скоби, точка и запетая и други”\nмета програмиране\n \n\n
  • \n
  • \n

Ruby/Rails Ruby/Rails Presentation Transcript

  • Ruby / RailsРадослав СтанковVarna Lab 14/07/2011
  • Кой съм аз?@rstankovhttp://rstankov.comhttp://blog.rstankov.comhttp://github.com/rstankov
  • RubyRuby е интерактивен,обектно-ориентиран език запрограмиране.Неготово мото е:“Optimized for programmer happiness”
  • Ruby on Rails Ruby on Rails е framework за уеб приложения. Неготово мото е: “Web development doesn’t hurt”
  • Ruby Създаден от японеца Юкихиро Мацумото „Мац“. Първата публична версия излиза през 1995. Версия 2.0 се очакава да излезе за Коледа / не се казва коя /
  • class System { // ... code ... private $_categories = null; public function getVisibleCategories() { if ($this->_categories === null) { $this->_categories = $this->findCategories(array( visible => true )); } return $this->_categories; }}
  • class System # ... code ... def visible_categories() return @categories ||= self.find_categories({:visible => t endend
  • class System # ... code ... def visible_categories() return @categories ||= self.find_categories({:visible => t endend
  • class System # ... code ... def visible_categories return @categories ||= self.find_categories({:visible => t endend
  • class System # ... code ... def visible_categories return @categories ||= self.find_categories({:visible => t endend
  • class System # ... code ... def visible_categories return @categories ||= self.find_categories({:visible => t endend
  • class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
  • class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
  • class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
  • class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
  • class System # ... code ... def visible_categories @categories ||= find_categories({:visible => true}) endend
  • class System # ... code ... def visible_categories @categories ||= find_categories({:visible => true}) endend
  • class System # ... code ... def visible_categories @categories ||= find_categories :visible => true endend
  • 5.times { puts "Ruby is cool!" }
  • 5.times do puts "Ruby is cool!"end
  • File.open("some_file.txt") do |file| file << "content"end
  • [1,2,3,4].each { |value| puts value }# => [1, 2, 3, 4][1,2,3,4].map { |value| value * value }# => [1, 4, 9, 16][1,2,3,4].reduce { |a, b| a + b }# => 10[1,2] * 3# => [1, 2, 1, 2, 1, 2]
  • def operate(value) yield valueendvalue = operate(5) { |v| v + 4 }puts value # 9
  • class Person attr_accessor :fist_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name first_name + " " + last_name endendme = Person.new("Radoslav", "Stankov")puts me.full_name # Radoslav Stankov
  • class Person attr_accessor :fist_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name first_name + " " + last_name endendme = Person.new("Radoslav", "Stankov")puts me.full_name # Radoslav Stankov
  • class Person attr_accessor :fist_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name first_name + " " + last_name endendme = Person.new("Radoslav", "Stankov")puts me.full_name # Radoslav Stankov
  • class Person attr_accessor :fist_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name first_name + " " + last_name endendme = Person.new("Radoslav", "Stankov")puts me.full_name # Radoslav Stankov
  • class Person attr_accessor :fist_name, :last_name def initialize(first_name, last_name) @first_name = first_name @last_name = last_name end def full_name first_name + " " + last_name endendme = Person.new("Radoslav", "Stankov")puts me.full_name # Radoslav Stankov
  • class Person def +(other_person) # ... endendperson1 + person2
  • class Array def first self[0] end def second self[1] endendarray = [1, 2, 3, 4]array.first # 1array.second # 2
  • class Numeric def plus(x) self + x endendy = 5.plus(6)
  • Time.now - 2.days == 2.days.ago1.month.ago + 45.days - 1.year
  • Ruby• димично определяне на типа данните• модули• отворени класове• блокове• анонимни функции• всяка операция връща резултат• всичко е изпълним код• изчистен синтаксис• мета програмиране• промяна на обектите по време на изпълнение• вградени регулярни изрази
  • Ruby on Rails Разработен от David Heinemeier Hansson от 37 Signals. Първата публична версия е излиза през юли 2004. Вървим бавно, но сигурно към 3.1
  • 37signals Милиони клиенти ... по-малко от 37 служителя
  • Основни принципи на Ruby on Rails• Convention over Configuration• DRY - Don’t Repeat Yourself• KISS - Keep it simple, Stupid!• Skinny Controller, Fat Model• Тest Driven Development / Behavior Driven Development• Less is More• Code Generation• REST
  • Основни принципи на Ruby on Rails• Convention over Configuration• DRY - Don’t Repeat Yourself• KISS - Keep it simple, Stupid!• Skinny Controller, Fat Model• Тest Driven Development / Behavior Driven Development• Less is More• Code Generation• REST N ! VE FU HA
  • MVC Архитектура
  • Начин на работа
  • RESTMethod Path Controller Action GET /tasks tasks index GET /tasks/new tasks new POST /tasks tasks create GET /tasks/:id tasks show GET /tasks/:id/edit tasks edit PUT /tasks/:id tasks updateDELETE /tasks/:id tasks delete
  • Url формати Method Path Shows Action GET /tasks/1 html show GET /tasks/1.xml xml show GET /tasks/1.json json show GET /tasks/1.print html show PUT /tasks/1 redirect updatePUT(xhr) /tasks/1 html/js update PUT /tasks/1.json json update
  • Modelclass Task < ActiveRecord::Base belongs_to :user has_many :comments validates_presence_of :user, :text validates_inclusion_of :status, :in => ["opened", "completed"] attr_readonly :user_id def editable? status == "opened" endend
  • Modelclass Task < ActiveRecord::Base belongs_to :user has_many :comments validates_presence_of :user, :text validates_inclusion_of :status, :in => ["opened", "completed"] attr_readonly :user_id def editable? status == "opened" endend
  • Modelclass Task < ActiveRecord::Base belongs_to :user has_many :comments validates_presence_of :user, :text validates_inclusion_of :status, :in => ["opened", "completed"] attr_readonly :user_id def editable? status == "opened" endend
  • Modelclass Task < ActiveRecord::Base belongs_to :user has_many :comments validates_presence_of :user, :text validates_inclusion_of :status, :in => ["opened", "completed"] attr_readonly :user_id def editable? status == "opened" endend
  • Modelclass Task < ActiveRecord::Base belongs_to :user has_many :comments validates_presence_of :user, :text validates_inclusion_of :status, :in => ["opened", "completed"] attr_readonly :user_id def editable? status == "opened" endend
  • Controllerclass TasksController < ApplicationController before_filter :require_user def index @tasks = Task.where(:status => "opened") end def show @task = Task.find(params[:id]) end def create @task = current_user.tasks.build(params[:task]) if @task.save redirect_to tasks_path else render :partial => "new" end endend
  • Controllerclass TasksController < ApplicationController before_filter :require_user def index @tasks = Task.where(:status => "opened") end def show @task = Task.find(params[:id]) end def create @task = current_user.tasks.build(params[:task]) if @task.save redirect_to tasks_path else render :partial => "new" end endend
  • Controllerclass TasksController < ApplicationController before_filter :require_user def index @tasks = Task.where(:status => "opened") end def show @task = Task.find(params[:id]) end def create @task = current_user.tasks.build(params[:task]) if @task.save redirect_to tasks_path else render :partial => "new" end endend
  • Controllerclass TasksController < ApplicationController before_filter :require_user def index @tasks = Task.where(:status => "opened") end def show @task = Task.find(params[:id]) end def create @task = current_user.tasks.build(params[:task]) if @task.save redirect_to tasks_path else render :partial => "new" end endend
  • Controllerclass TasksController < ApplicationController before_filter :require_user def index @tasks = Task.where(:status => "opened") end def show @task = Task.find(params[:id]) end def create @task = current_user.tasks.build(params[:task]) if @task.save redirect_to tasks_path else render :partial => "new" end endend
  • View<%= form_for task do |form| %> <%= render shared/error_messages, :target => form.object%> <p> <%= form.label :text %> <%= form.text_area :text %> </p> <p> <%= form.label :status %> <%= form.select :status, Task.statuses %> </p> <div class="buttons"> <%= form.submit %> | <% link_to "Cancel", tasks_path %> </div><% end %>
  • View + simple_form / slim = simple_form_for task do |form| = form.error_banner = form.input :text = form.input :status, :collection => Task.statuses .buttons = form.submit = link_to Cancel, tasks_path
  • Test Driven Development
  • Test Driven Development1 Добавя се тест ... за несъществуващ код
  • Test Driven Development1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине
  • Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине3 Правят се подобрения ... подобрява се качеството на кода
  • Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине3 Правят се подобрения ... подобрява се качеството на кода
  • Cucumber featureFeature: Tasks In order to get more productive and organize As a user I want able to manage my tasks Scenario: Adding tasks Given I am on the tasks page When I follow "New task" And I fill in "Text" with "Present Ruby" And I select "opened" from "Status" And I press "Create task" Then I should have opened task "Present Ruby" Scenario: Completing tasks Given I am on the tasks page And I have opened task "Present Ruby" When I follow "Edit tasks" And I select "completed" from "Status" And I press "Update task" Then I should have completed task "Present Ruby"
  • Тесване на Controllerdescribe TasksController do describe "GET show" do before { Task.should_recive(:find).with("1").and_return task } before { get :show, :id => "1" } it { should assign_to(:task).with(task) } it { should render_temlate("show") } endend
  • describe Task do it { should belong_to(:user) } it { should have_many(:notes) } it { should validate_presence_of(:user) } it { should validate_presence_of(:text) } describe "#editable?" do it "returns true if task status is opened" do Task.new(:status => "opened").should be_editable end it "returns false if task status is rejected" do Task.new(:status => "rejected").should_not be_editable end it "returns false if task status is completed" do Task.new(:status => "completed").should_not be_editable end endend
  • Тестване на Viewdescribe "tasks/show.html.erb" do before do assign :task, mock_model(Task, { :id => 1, :text => "task text" }) render end it "renders task text" do rendered.should contain("task text") end it "renders link for editing task" do rendered.should have_selector(a[href="/tasks/1/edit"]) endend
  • ... и още, и още• database migrations• gem dependency management• css/javascript management (from Rails 3.1)• nested forms• automatic deploys• Rack• generations• send/receive mails• caching• internalization (i18n)• Ruby language extentions• a LOT plugins, tools and services• ... и т.н.
  • Погрешни схващания• Rails CANT SCALE• Rails is SLOW!!!!• Hard to deploy• Too much magic• Hard to learn every thing• Impossible to extend rails!• No good IDE• Bad windows support• Documentation
  • Погрешни схващания• Rails CANT SCALE• Rails is SLOW!!!!• Hard to deploy• Too much magic• Hard to learn every thing• Impossible to extend rails!• No good IDE• Bad windows support• Documentation
  • Погрешни схващания• Rails CANT SCALE• Rails is SLOW!!!!• Hard to deploy• Too much magic• Hard to learn every thing• Impossible to extend rails!• No good IDE• Bad windows support• Documentation
  • Погрешни схващания• Rails CANT SCALE• Rails is SLOW!!!!• Hard to deploy• Too much magic• Hard to learn every thing• Impossible to extend rails!• No good IDE• Bad windows support• Documentation
  • Погрешни схващания• Rails CANT SCALE• Rails is SLOW!!!!• Hard to deploy• Too much magic• Hard to learn every thing• Impossible to extend rails!• No good IDE• Bad windows support• Documentation
  • Погрешни схващания• Rails CANT SCALE• Rails is SLOW!!!!• Hard to deploy• Too much magic• Hard to learn every thing• Impossible to extend rails!• No good IDE• Bad windows support• Documentation
  • Погрешни схващания• Rails CANT SCALE• Rails is SLOW!!!!• Hard to deploy• Too much magic• Hard to learn every thing• Impossible to extend rails!• No good IDE• Bad windows support• Documentation
  • Погрешни схващания• Rails CANT SCALE• Rails is SLOW!!!!• Hard to deploy• Too much magic• Hard to learn every thing• Impossible to extend rails!• No good IDE• Bad windows support• Documentation
  • Погрешни схващания• Rails CANT SCALE• Rails is SLOW!!!!• Hard to deploy• Too much magic• Hard to learn every thing• Impossible to extend rails!• No good IDE• Bad windows support• Documentation
  • Благодаря за вниманието@rstankov