Your SlideShare is downloading. ×
  • Like
Ruby/Rails
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply
Published

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

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

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,900
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
15
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • \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

Transcript

  • 1. Ruby / RailsРадослав СтанковVarna Lab 14/07/2011
  • 2. Кой съм аз?@rstankovhttp://rstankov.comhttp://blog.rstankov.comhttp://github.com/rstankov
  • 3. RubyRuby е интерактивен,обектно-ориентиран език запрограмиране.Неготово мото е:“Optimized for programmer happiness”
  • 4. Ruby on Rails Ruby on Rails е framework за уеб приложения. Неготово мото е: “Web development doesn’t hurt”
  • 5. Ruby Създаден от японеца Юкихиро Мацумото „Мац“. Първата публична версия излиза през 1995. Версия 2.0 се очакава да излезе за Коледа / не се казва коя /
  • 6. class System { // ... code ... private $_categories = null; public function getVisibleCategories() { if ($this->_categories === null) { $this->_categories = $this->findCategories(array( visible => true )); } return $this->_categories; }}
  • 7. class System # ... code ... def visible_categories() return @categories ||= self.find_categories({:visible => t endend
  • 8. class System # ... code ... def visible_categories() return @categories ||= self.find_categories({:visible => t endend
  • 9. class System # ... code ... def visible_categories return @categories ||= self.find_categories({:visible => t endend
  • 10. class System # ... code ... def visible_categories return @categories ||= self.find_categories({:visible => t endend
  • 11. class System # ... code ... def visible_categories return @categories ||= self.find_categories({:visible => t endend
  • 12. class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
  • 13. class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
  • 14. class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
  • 15. class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
  • 16. class System # ... code ... def visible_categories @categories ||= find_categories({:visible => true}) endend
  • 17. class System # ... code ... def visible_categories @categories ||= find_categories({:visible => true}) endend
  • 18. class System # ... code ... def visible_categories @categories ||= find_categories :visible => true endend
  • 19. 5.times { puts "Ruby is cool!" }
  • 20. 5.times do puts "Ruby is cool!"end
  • 21. File.open("some_file.txt") do |file| file << "content"end
  • 22. [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]
  • 23. def operate(value) yield valueendvalue = operate(5) { |v| v + 4 }puts value # 9
  • 24. 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
  • 25. 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
  • 26. 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
  • 27. 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
  • 28. 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
  • 29. class Person def +(other_person) # ... endendperson1 + person2
  • 30. class Array def first self[0] end def second self[1] endendarray = [1, 2, 3, 4]array.first # 1array.second # 2
  • 31. class Numeric def plus(x) self + x endendy = 5.plus(6)
  • 32. Time.now - 2.days == 2.days.ago1.month.ago + 45.days - 1.year
  • 33. Ruby• димично определяне на типа данните• модули• отворени класове• блокове• анонимни функции• всяка операция връща резултат• всичко е изпълним код• изчистен синтаксис• мета програмиране• промяна на обектите по време на изпълнение• вградени регулярни изрази
  • 34. Ruby on Rails Разработен от David Heinemeier Hansson от 37 Signals. Първата публична версия е излиза през юли 2004. Вървим бавно, но сигурно към 3.1
  • 35. 37signals Милиони клиенти ... по-малко от 37 служителя
  • 36. Основни принципи на 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
  • 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 N ! VE FU HA
  • 38. MVC Архитектура
  • 39. Начин на работа
  • 40. 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
  • 41. 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
  • 42. 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
  • 43. 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
  • 44. 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
  • 45. 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
  • 46. 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
  • 47. 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
  • 48. 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
  • 49. 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
  • 50. 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
  • 51. 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
  • 52. 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 %>
  • 53. 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
  • 54. Test Driven Development
  • 55. Test Driven Development1 Добавя се тест ... за несъществуващ код
  • 56. Test Driven Development1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине
  • 57. Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине3 Правят се подобрения ... подобрява се качеството на кода
  • 58. Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине3 Правят се подобрения ... подобрява се качеството на кода
  • 59. 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"
  • 60. Тесване на 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
  • 61. 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
  • 62. Тестване на 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
  • 63. ... и още, и още• 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• ... и т.н.
  • 64. Погрешни схващания• 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
  • 65. Погрешни схващания• 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
  • 66. Погрешни схващания• 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
  • 67. Погрешни схващания• 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
  • 68. Погрешни схващания• 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
  • 69. Погрешни схващания• 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
  • 70. Погрешни схващания• 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
  • 71. Погрешни схващания• 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
  • 72. Погрешни схващания• 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
  • 73. Благодаря за вниманието@rstankov