Ruby/Rails

3,015
-1

Published on

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

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,015
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
16
Comments
0
Likes
2
Embeds 0
No embeds

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
  • Ruby/Rails

    1. 1. Ruby / RailsРадослав СтанковVarna Lab 14/07/2011
    2. 2. Кой съм аз?@rstankovhttp://rstankov.comhttp://blog.rstankov.comhttp://github.com/rstankov
    3. 3. RubyRuby е интерактивен,обектно-ориентиран език запрограмиране.Неготово мото е:“Optimized for programmer happiness”
    4. 4. Ruby on Rails Ruby on Rails е framework за уеб приложения. Неготово мото е: “Web development doesn’t hurt”
    5. 5. Ruby Създаден от японеца Юкихиро Мацумото „Мац“. Първата публична версия излиза през 1995. Версия 2.0 се очакава да излезе за Коледа / не се казва коя /
    6. 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. 7. class System # ... code ... def visible_categories() return @categories ||= self.find_categories({:visible => t endend
    8. 8. class System # ... code ... def visible_categories() return @categories ||= self.find_categories({:visible => t endend
    9. 9. class System # ... code ... def visible_categories return @categories ||= self.find_categories({:visible => t endend
    10. 10. class System # ... code ... def visible_categories return @categories ||= self.find_categories({:visible => t endend
    11. 11. class System # ... code ... def visible_categories return @categories ||= self.find_categories({:visible => t endend
    12. 12. class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
    13. 13. class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
    14. 14. class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
    15. 15. class System # ... code ... def visible_categories @categories ||= self.find_categories({:visible => true}) endend
    16. 16. class System # ... code ... def visible_categories @categories ||= find_categories({:visible => true}) endend
    17. 17. class System # ... code ... def visible_categories @categories ||= find_categories({:visible => true}) endend
    18. 18. class System # ... code ... def visible_categories @categories ||= find_categories :visible => true endend
    19. 19. 5.times { puts "Ruby is cool!" }
    20. 20. 5.times do puts "Ruby is cool!"end
    21. 21. File.open("some_file.txt") do |file| file << "content"end
    22. 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. 23. def operate(value) yield valueendvalue = operate(5) { |v| v + 4 }puts value # 9
    24. 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. 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. 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. 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. 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. 29. class Person def +(other_person) # ... endendperson1 + person2
    30. 30. class Array def first self[0] end def second self[1] endendarray = [1, 2, 3, 4]array.first # 1array.second # 2
    31. 31. class Numeric def plus(x) self + x endendy = 5.plus(6)
    32. 32. Time.now - 2.days == 2.days.ago1.month.ago + 45.days - 1.year
    33. 33. Ruby• димично определяне на типа данните• модули• отворени класове• блокове• анонимни функции• всяка операция връща резултат• всичко е изпълним код• изчистен синтаксис• мета програмиране• промяна на обектите по време на изпълнение• вградени регулярни изрази
    34. 34. Ruby on Rails Разработен от David Heinemeier Hansson от 37 Signals. Първата публична версия е излиза през юли 2004. Вървим бавно, но сигурно към 3.1
    35. 35. 37signals Милиони клиенти ... по-малко от 37 служителя
    36. 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. 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. 38. MVC Архитектура
    39. 39. Начин на работа
    40. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 54. Test Driven Development
    55. 55. Test Driven Development1 Добавя се тест ... за несъществуващ код
    56. 56. Test Driven Development1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине
    57. 57. Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине3 Правят се подобрения ... подобрява се качеството на кода
    58. 58. Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине3 Правят се подобрения ... подобрява се качеството на кода
    59. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 73. Благодаря за вниманието@rstankov
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×