Uploaded on

My presentation from Ruby on Rails seminar in Varna at Varna Free University "Chernorizets Hrabar"

My presentation from Ruby on Rails seminar in Varna at Varna Free University "Chernorizets Hrabar"

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

Views

Total Views
1,068
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
8
Comments
0
Likes
0

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
  • Стремежът на Ruby е да следва принципа на най-малка изненада. Това означава, че поведението на езика трябва да е интуитивно и той да работи така, както програмистът би очаквал.\nRuby е обектно-ориентиран: всеки тип данни е обект, включително класове, числа, булеви стойности, които в много други езици определят като примитиви, а не като реални обекти.\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
  • 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
  • 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
  • \n

Transcript

  • 1. Защо Ruby и Rails ?Радослав СтанковRuby on Rails семинар – Варненски свободен университет 2010
  • 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. private $_products = null;public function getProducts($categoryId){ if ($this->_products === null){ $this->_products = Product::where(array( category_id => $categoryId )); } return $this->products;}
  • 7. def products(category_id) @products ||= Product.where({ :category_id => category_id })end
  • 8. def products(category_id) @products ||= Product.where({ :category_id => category_id })end
  • 9. def products(category_id) @products ||= Product.where({ :category_id => category_id })end
  • 10. def products(category_id) @products ||= Product.where({ :category_id => category_id })end
  • 11. def products(category_id) @products ||= Product.where({ :category_id => category_id })end
  • 12. def products(category_id) @products ||= Product.where({ :category_id => category_id })end
  • 13. def products(category_id) @products ||= Product.where( :category_id => category_id )end
  • 14. def products(category_id) @products ||= Product.where :category_id => category_idend
  • 15. 5.times { puts "Ruby is cool!" }5.times do puts "Ruby is cool!"end
  • 16. File.open("some_file.txt") do |file| file << "content"end
  • 17. [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
  • 18. def operate(value) yield valueendvalue = operate(5) { |v| v + 4 }puts value # 9
  • 19. 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
  • 20. 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
  • 21. 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
  • 22. 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
  • 23. 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
  • 24. class Person def +(other_person) # ... endendperson1 + person2
  • 25. class Array def first self[0] end def second self[1] endendarray = [1, 2, 3, 4]array.first # 1array.second # 2
  • 26. class Numeric def plus(x) self + x endendy = 5.plus(6)
  • 27. Time.now - 2.days == 2.days.ago1.month.ago + 45.days - 1.year
  • 28. Ruby• димично определяне на типа данните• модули• отворени класове• блокове• анонимни функции• всяка операция връща резултат• всичко е изпълним код• изчистен синтаксис• мета програмиране• промяна на обектите по време на изпълнение• вградени регулярни изрази
  • 29. Ruby on Rails Разработен от David Heinemeier Hansson от 37 Signals. Първата публична версия е излиза през юли 2004. Текущата стабилна версия е 3.0.3
  • 30. 37signals Милиони клиенти ... по-малко от 37 служителя
  • 31. MVC Архитектура
  • 32. Начин на работа
  • 33. 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
  • 34. 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
  • 35. 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
  • 36. 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
  • 37. 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
  • 38. Controllerclass TasksController < ApplicationController def index @tasks = Tasks.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
  • 39. Controllerclass TasksController < ApplicationController def index @tasks = Tasks.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
  • 40. Controllerclass TasksController < ApplicationController def index @tasks = Tasks.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
  • 41. Controllerclass TasksController < ApplicationController def index @tasks = Tasks.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
  • 42. 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", task_path %> </div><% end %>
  • 43. Test Driven Development
  • 44. Test Driven Development1 Добавя се тест ... за несъществуващ код
  • 45. Test Driven Development1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине
  • 46. Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине3 Правят се подобрения ... подобрява се качеството на кода
  • 47. Test Driven Development 1 Добавя се тест ... за несъществуващ код 2 Пише се код ... колкото само тестът да мине3 Правят се подобрения ... подобрява се качеството на кода
  • 48. 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
  • 49. Тесване на 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
  • 50. Тестване на 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
  • 51. Благодаря за вниманието@rstankov