GEMS / PLUGINS
  Интересно, полезно, весело
Что такое джемс?

RubyGems (rubygems.org) — пакетный
менеджер для руби

Единый формат распространения отдельных
программ и библиотек

Программа для установки библиотек (джемс)

Сервер для распространения джемс
Преимущества джемс

require ‘rubygems’
require ‘gemname’

sudo gem update

Отсутствие централизации

Стандартный формат: 8300 джемс на
Rubyforge, 7400 джемс на Github
Github


125000 пользователей

100000 проектов

gists

GitHub Pages
restful-authentication
                   (technoweenie)




./script/generate authenticated user sessions

map.signup ‘/signup’,
  :controller => ‘users’, :action => ‘new’
map.login ‘/login’,
  :controller => ‘session’, :action => ‘new’
map.logout ‘/logout’,
  :controller => ‘session’, :action => ‘destroy’
authlogic            (binarylogic)




class UserSession < Authlogic::Session::Base
  # specify configuration here, such as:
  # logout_on_timeout true
  # ...many more options in the documentation
end

UserSession.create(:login => "john",
                   :password => "my password",
                   :remember_me => true)

session.destroy
will_paginate                (mislav)




Post.paginate :page => 1,
              :order => 'created_at DESC'

@posts = Post.paginate_by_board_id
                     @board.id,
                     :page => params[:page],
                     :order => 'updated_at DESC'

<%= will_paginate @posts %>
paperclip            (thoughtbot)




class User < ActiveRecord::Base
  has_attached_file :avatar,
                    :styles => {
                          :medium => "300x300>",
                          :thumb => "100x100>" }
end

<%= image_tag @user.avatar.url %>
<%= image_tag @user.avatar.url(:medium) %>
<%= image_tag @user.avatar.url(:thumb) %>
cucumber            (aslakhellesoy)




Feature: Addition
  In order to avoid silly mistakes
  As a math idiot
  I want to be told the sum of two numbers

  Scenario: Add two numbers
    Given I visit the calculator page
    And I fill in '50' for 'first'
    And I fill in '70' for 'second'
    When I press 'Add'
    Then I should see 'Answer: 120'
cucumber                   (cont’d)




Given /^I visit the calculator page$/ do
  visit '/add'
end

Given /^I fill in '(.*)' for '(.*)'$/ do |value, field|
  fill_in(field, :with => value)
end

When /^I press '(.*)'$/ do |name|
  click_button(name)
end

Then /^I should see '(.*)'$/ do |text|
  response_body.should contain(/#{text}/m)
end 
attachment_fu                (technoweenie)




has_attachment
  :size => 1.megabyte..2.megabytes
has_attachment
  :content_type => 'application/pdf'
has_attachment
  :store => :s3, :cloudfront => true

attachment_obj.public_filename
  #=> /attachments/2/file.jpg
attachment_obj.public_filename(:thumb)
  #=> /attachments/2/file_thumb.jpg
webrat         (brynary)




visit home_path
click_link "Sign up"
fill_in "Email", :with => "good@example.com"
select "Free account"
click_button "Register"
bort          (fudgestudios)




default css

rm rails.png/index.html

page title helper

application layout

filtering password /password_confirmation

database for sessions

capistrano for git/passenger

plugins (RESTful authentication, role requirement, Open ID authentication,
will_paginate, rspec/rspec-rails, exception notifier, asset packager)
whenever            (javan)




wheneverize .

every 3.hours do
  runner "MyModel.some_process"
  rake "my:rake:task"
end

every 1.day, :at => '4:30 am' do
  command "/usr/bin/my_great_command"
end

whenever --update-crontab
formtastic                               (justinfrench)



<% semantic_form_for @article do |form| %>
 <% form.inputs :name => "Basic" do %>
  <%= form.input :title %>
  <%= form.input :publication_state, :as => :radio %>
  <%= form.input :allow_comments, :label => "Allow commenting on this article" %>
 <% end %>`

 <% form.inputs :name => "Advanced" do %>
  <%= form.input :keywords, :required => false, :hint => "Example: ruby, rails, forms"
%>
 <% end %>

 <% form.inputs :name => "Author", :for => :author do |author_form| %>
  <%= author_form.input :first_name %>
  <%= author_form.input :last_name %>
 <% end %>

 <% form.buttons do %>
  <%= form.commit_button %>
 <% end %>
<% end %>
delayed_job                                                    (tobi)




create_table :delayed_jobs, :force => true do |table|
   table.integer :priority, :default => 0 #Allows some jobs to jump to the front of the queue
   table.integer :attempts, :default => 0 #Provides for retries, but still fail eventually.
   table.text :handler #YAML-encoded string of the object that will do work
   table.string :last_error #reason for last failure (See Note below)
   table.datetime :run_at #When to run. Could be Time.now for immediately, or sometime in the future.
   table.datetime :locked_at #Set when a client is working on this object
   table.datetime :failed_at #Set when all retries have failed (actually, by default, the record is
deleted instead)

   table.string :locked_by           #Who is working on this object (if locked)

   table.timestamps
end

MyJob#perform
haml               (Hampton Caitlin)



%ul
  %li Salt
  %li Pepper


%p
  Date/Time:
  - now = DateTime.now
  %strong= now
  - if now > DateTime.parse("December 31, 2006")
    = "Happy new " + "year!"


!main_bg= #46ar12
!main_width= 40em

#main
  background-color = !main_bg
  width = !main_width
  .sidebar
    background-color = !main_bg + #333333
    width = !main_width - 25em
searchlogic           (binarylogic)




User.username_equals("bjohnson")
User.username_does_not_equal("bjohnson")
User.username_begins_with("bjohnson")
User.username_not_begin_with("bjohnson")
User.username_like("bjohnson")
User.username_ends_with("bjohnson")
User.age_greater_than(20)
User.age_greater_than_or_equal_to(20)
User.username_null
User.username_not_null
User.username_blank
searchlogic                                                 (cont’d)




User.username_eq(10) # equals
User.id_lt(10)        # less than
User.id_lte(10)       # less than or equal to
User.id_gt(10)        # greater than
User.id_gte(10)       # greater than or equal to
User.orders_total_greater_than(20)
User.orders_line_items_price_greater_than(20)
User.ascend_by_order_total
User.descend_by_orders_line_items_price
User.username_like_all("bjohnson", "thunt") #will return any users that have all of the strings in their username
User.username_like_any(["bjohnson", "thunt"]) #also accepts an array
User.username_or_first_name_like("ben")
User.id_or_age_lt_or_username_or_first_name_begins_with(10)
search = User.search(:username_like => "bjohnson", :age_less_than => 20)
User.named_scope :four_year_olds, :conditions => {:age => 4}
User.search(:four_year_olds => true, :username_like => "bjohnson")
User.username_like("bjohnson").age_less_than(20).paginate(:page => params[:page])
User.search(:username_like => "bjohnson", :age_less_than => 20).paginate(:page =>
params[:page])
User.searchlogic
Автора ÿбер-джемсов
Technoweenie — Рик          Fudgestudios — Фил
Олсон, ENTP                 Джеффс, fudgestudios

Binarylogic — Бен           Javan — Джаван Махмали,
Джонсон, Binary Logic       Inkling Markets

Mislav — Мислав             Justinfrench — Джастин
Марохнич, Uniqpath          Френч, Indent

Aslakhellesoy — Аслак       Tobi — Тобиас Лютке,
Хеллесёй, BEKK Consulting   JadedPixel

Brynary — Брайан            hampton — Хэмптон
Хелмкамп, weplay            Кейтлин
Спасибо!


apostlion@gmail.com

@apostlion

RubyBarCamp “Полезные gems и plugins”

  • 1.
    GEMS / PLUGINS Интересно, полезно, весело
  • 2.
    Что такое джемс? RubyGems(rubygems.org) — пакетный менеджер для руби Единый формат распространения отдельных программ и библиотек Программа для установки библиотек (джемс) Сервер для распространения джемс
  • 3.
    Преимущества джемс require ‘rubygems’ require‘gemname’ sudo gem update Отсутствие централизации Стандартный формат: 8300 джемс на Rubyforge, 7400 джемс на Github
  • 4.
  • 5.
    restful-authentication (technoweenie) ./script/generate authenticated user sessions map.signup ‘/signup’, :controller => ‘users’, :action => ‘new’ map.login ‘/login’, :controller => ‘session’, :action => ‘new’ map.logout ‘/logout’, :controller => ‘session’, :action => ‘destroy’
  • 6.
    authlogic (binarylogic) class UserSession < Authlogic::Session::Base # specify configuration here, such as: # logout_on_timeout true # ...many more options in the documentation end UserSession.create(:login => "john", :password => "my password", :remember_me => true) session.destroy
  • 7.
    will_paginate (mislav) Post.paginate :page => 1, :order => 'created_at DESC' @posts = Post.paginate_by_board_id @board.id, :page => params[:page], :order => 'updated_at DESC' <%= will_paginate @posts %>
  • 8.
    paperclip (thoughtbot) class User < ActiveRecord::Base has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" } end <%= image_tag @user.avatar.url %> <%= image_tag @user.avatar.url(:medium) %> <%= image_tag @user.avatar.url(:thumb) %>
  • 9.
    cucumber (aslakhellesoy) Feature: Addition In order to avoid silly mistakes As a math idiot I want to be told the sum of two numbers Scenario: Add two numbers Given I visit the calculator page And I fill in '50' for 'first' And I fill in '70' for 'second' When I press 'Add' Then I should see 'Answer: 120'
  • 10.
    cucumber (cont’d) Given /^I visit the calculator page$/ do   visit '/add' end Given /^I fill in '(.*)' for '(.*)'$/ do |value, field|   fill_in(field, :with => value) end When /^I press '(.*)'$/ do |name|   click_button(name) end Then /^I should see '(.*)'$/ do |text|   response_body.should contain(/#{text}/m) end 
  • 11.
    attachment_fu (technoweenie) has_attachment :size => 1.megabyte..2.megabytes has_attachment :content_type => 'application/pdf' has_attachment :store => :s3, :cloudfront => true attachment_obj.public_filename #=> /attachments/2/file.jpg attachment_obj.public_filename(:thumb) #=> /attachments/2/file_thumb.jpg
  • 12.
    webrat (brynary) visit home_path click_link "Sign up" fill_in "Email", :with => "[email protected]" select "Free account" click_button "Register"
  • 13.
    bort (fudgestudios) default css rm rails.png/index.html page title helper application layout filtering password /password_confirmation database for sessions capistrano for git/passenger plugins (RESTful authentication, role requirement, Open ID authentication, will_paginate, rspec/rspec-rails, exception notifier, asset packager)
  • 14.
    whenever (javan) wheneverize . every 3.hours do runner "MyModel.some_process" rake "my:rake:task" end every 1.day, :at => '4:30 am' do command "/usr/bin/my_great_command" end whenever --update-crontab
  • 15.
    formtastic (justinfrench) <% semantic_form_for @article do |form| %> <% form.inputs :name => "Basic" do %> <%= form.input :title %> <%= form.input :publication_state, :as => :radio %> <%= form.input :allow_comments, :label => "Allow commenting on this article" %> <% end %>` <% form.inputs :name => "Advanced" do %> <%= form.input :keywords, :required => false, :hint => "Example: ruby, rails, forms" %> <% end %> <% form.inputs :name => "Author", :for => :author do |author_form| %> <%= author_form.input :first_name %> <%= author_form.input :last_name %> <% end %> <% form.buttons do %> <%= form.commit_button %> <% end %> <% end %>
  • 16.
    delayed_job (tobi) create_table :delayed_jobs, :force => true do |table| table.integer :priority, :default => 0 #Allows some jobs to jump to the front of the queue table.integer :attempts, :default => 0 #Provides for retries, but still fail eventually. table.text :handler #YAML-encoded string of the object that will do work table.string :last_error #reason for last failure (See Note below) table.datetime :run_at #When to run. Could be Time.now for immediately, or sometime in the future. table.datetime :locked_at #Set when a client is working on this object table.datetime :failed_at #Set when all retries have failed (actually, by default, the record is deleted instead) table.string :locked_by #Who is working on this object (if locked) table.timestamps end MyJob#perform
  • 17.
    haml (Hampton Caitlin) %ul %li Salt %li Pepper %p Date/Time: - now = DateTime.now %strong= now - if now > DateTime.parse("December 31, 2006") = "Happy new " + "year!" !main_bg= #46ar12 !main_width= 40em #main background-color = !main_bg width = !main_width .sidebar background-color = !main_bg + #333333 width = !main_width - 25em
  • 18.
    searchlogic (binarylogic) User.username_equals("bjohnson") User.username_does_not_equal("bjohnson") User.username_begins_with("bjohnson") User.username_not_begin_with("bjohnson") User.username_like("bjohnson") User.username_ends_with("bjohnson") User.age_greater_than(20) User.age_greater_than_or_equal_to(20) User.username_null User.username_not_null User.username_blank
  • 19.
    searchlogic (cont’d) User.username_eq(10) # equals User.id_lt(10) # less than User.id_lte(10) # less than or equal to User.id_gt(10) # greater than User.id_gte(10) # greater than or equal to User.orders_total_greater_than(20) User.orders_line_items_price_greater_than(20) User.ascend_by_order_total User.descend_by_orders_line_items_price User.username_like_all("bjohnson", "thunt") #will return any users that have all of the strings in their username User.username_like_any(["bjohnson", "thunt"]) #also accepts an array User.username_or_first_name_like("ben") User.id_or_age_lt_or_username_or_first_name_begins_with(10) search = User.search(:username_like => "bjohnson", :age_less_than => 20) User.named_scope :four_year_olds, :conditions => {:age => 4} User.search(:four_year_olds => true, :username_like => "bjohnson") User.username_like("bjohnson").age_less_than(20).paginate(:page => params[:page]) User.search(:username_like => "bjohnson", :age_less_than => 20).paginate(:page => params[:page]) User.searchlogic
  • 20.
    Автора ÿбер-джемсов Technoweenie —Рик Fudgestudios — Фил Олсон, ENTP Джеффс, fudgestudios Binarylogic — Бен Javan — Джаван Махмали, Джонсон, Binary Logic Inkling Markets Mislav — Мислав Justinfrench — Джастин Марохнич, Uniqpath Френч, Indent Aslakhellesoy — Аслак Tobi — Тобиас Лютке, Хеллесёй, BEKK Consulting JadedPixel Brynary — Брайан hampton — Хэмптон Хелмкамп, weplay Кейтлин
  • 21.