Программирование на Ruby - ÐовоÑти

Ya_Acl - Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ ÑпиÑка прав доÑтупа (ACL)

Ya_Acl предÑтавлÑет Ñобой ÑамоÑтоÑтельный объект поÑредÑтвом которого производÑÑ‚ÑÑ Ð²Ñе проверки. Это значит что он не привÑзан к фреймворкам и Ñто руководÑтво предлагает только один из возможных путей иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтого компонента.

УÑтановка

gem install ya_acl

ОÑновные понÑтиÑ

РеÑÑƒÑ€Ñ - объект, доÑтуп к которому контролируетÑÑ. ÐŸÑ€Ð¸Ð²Ð¸Ð»ÐµÐ³Ð¸Ñ - дейÑтвие Ñовершаемое над реÑурÑом. Роль - объект, который может запрашивать доÑтуп к реÑурÑу.

Роль(роли) запрашивает доÑтуп к привилегии реÑурÑа. Ðапример реÑÑƒÑ€Ñ â€œÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒâ€ Ð¼Ð¾Ð¶ÐµÑ‚ иметь привилегию “Ñоздатьâ€.

Ðачальные уÑловиÑ

По умолчанию вÑе запрещено. И по ходу можно только выÑтавлÑть разрешениÑ, но не запреты.
Ð’Ñе реÑурÑÑ‹ должны быть добавлены в acl (в противном Ñлучае получите иÑключение).

ОÑновные возможноÑти

Assert - динамичеÑкие проверки, например, ÑвлÑетÑÑ Ð»Ð¸ залогиненый пользователь владельцем Ñтого объекта. Проверки могут ÑтавитьÑÑ Ð½Ð° конкретные роли Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ привилегии, а не проÑто “на привилегиюâ€. Владение неÑколькими ролÑми. ЕÑли Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одной из ролей Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½ доÑтуп к привилегии реÑурÑа, то доÑтуп открыт. Роль Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¼ доÑтупом ко вÑем реÑурÑам. ПередаетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð¼ в метод билдера “resourcesâ€. ÐаÑледование ролей Ð´Ð»Ñ Ñ€ÐµÑурÑов. То еÑть мы можем определить роли которым автоматичеÑки Ñтанут доÑтупны вÑе привилегии реÑурÑа.

ПорÑдок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€Ð¾Ðº на доÑтупноÑть к привилегии реÑурÑа

ЕÑли ни одна из переданных ролей не имеет доÑтупа к привилегии реÑурÑа, то доÑтуп запрещаетÑÑ.
Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ роли, имеющий доÑтуп к привилегии, проверÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ предназначенные Ð´Ð»Ñ Ñтой роли. ЕÑли Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ роли прошли вÑе проверки, то доÑтуп разрешаетÑÑ.
Workflow

Ð’ начале необходимо проинициализировать объект acl. Ð”Ð»Ñ Ñтого необходимо Ñоздать файл (Ñтруктура ниже) который будет загружатьÑÑ Ð¿Ñ€Ð¸ Ñтарте приложениÑ. Ð¥Ð¾Ñ‚Ñ Ð² development Ñреде вы можете захотеть подгружать его при каждом запроÑе Ð´Ð»Ñ ÑƒÐ´Ð¾Ð±Ñтва разработки.

YaAcl::Builder.build do
      roles do # Роли
        role :admin
        role :editor
        role :operator
      end

      asserts do # Проверки
        assert :assert_name, [:current_user_id, :another_user_id] do
          current_user_id == another_user_id
        end

        assert :another_assert_name, [:current_user_id, :another_user_id] do
          current_user_id != another_user_id
        end
      end

  resources :admin do # РеÑурÑÑ‹ и роль которой доÑтупно вÑе
    resource 'UserController', [:editor] do # РеÑÑƒÑ€Ñ Ð¸ роли которым доÑтупны вÑе привилегии данного реÑурÑа
      privilege :index, [:operator] # доÑтупно Ð´Ð»Ñ :admin, :editor, :operator
      privilege :edit # доÑтупно Ð´Ð»Ñ :admin, :editor
      privilege :new do
        assert :assert_name, [:editor] # Эта проверка будет вызвана только Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ :editor
        assert :another_assert_name # Эта проверка будет вызвана Ð´Ð»Ñ Ñ€Ð¾Ð»ÐµÐ¹ :admin, :editor
      end
    end
  end
end

ПоÑле Ñтого будет доÑтупен объект acl через YaAcl::Acl.instance.

acl = YaAcl::Acl.instance

acl.allow?('UserController', :index, [:editor, :opeartor]) # true
acl.allow?('UserController', :edit, [:editor, :opeartor]) # true
acl.allow?('UserController', :edit, [:opeartor]) # false
acl.allow?('UserController', :new, [:admin], :current_user_id => 1, :another_user_id => 1) # true
acl.allow?('UserController', :new, [:editor], :current_user_id => 1, :another_user_id => 2) # false

acl#check - возвращает объект результата YaAcl::Result
acl#check! - возвращает true или броÑает иÑключение
[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

ИнÑтрумент Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñвоими руками

Ð’Ñе, наверное, уже знают о ActiveSupport::Notifications. Эта библиотека дает возможноÑть одним чаÑÑ‚Ñм Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ ÑобытиÑ, а другим подпиÑыватьÑÑ Ð½Ð° них и требуемым образом реагировать на полученную информацию о Ñобытии.

37signals делÑÑ‚ÑÑ Ð¾Ð¿Ñ‹Ñ‚Ð¾Ð¼ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑиÑтемы мониторинга Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±Ð°Ð·Ð¸Ñ€ÑƒÐµÑ‚ÑÑ Ð½Ð° ActiveSupport::Notifications и statsd.

ЕÑли вам интереÑно ÑамоÑтоÑтельно Ñоздать такой инÑтрумент, или возможноÑтей NewRelic не доÑтаточно, то наÑтоÑтельно рекомендую прочитать Ñтатью "Pssst... your Rails application has a secret to tell you"

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Cane - анализатор качеÑтва кода

Команда ÑервиÑа Square продолжает делать вклад в open source и развитие ÑообщеÑтва разработчиков.

Ðа Ñто раз они предÑтавлÑÑŽÑ‚ Cane - инÑтрумент анализа кода напиÑанного на Ruby. Он разработан Ñпециально Ð´Ð»Ñ MRI 1.9, но может анализировать код проекта, который иÑпользует Ruby 1.8. ВерÑÐ¸Ñ 1.9 нужна только Ð´Ð»Ñ Ñамого Cane.

Полезной ÑвлÑетÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñть наÑтраивать то аÑпекты кода, на которые Cane должен обращать внимание.

СÑылки:

Ð²Ð²Ð¾Ð´Ð½Ð°Ñ ÑÑ‚Ð°Ñ‚ÑŒÑ - Cane: failing your build for code quality problems репозиторий - github.com/square/cane
[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Слайды от докладчиков конференции .тоÑтер {ruby}

10 Ñ„ÐµÐ²Ñ€Ð°Ð»Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ .тоÑтер {ruby}. Было очень интереÑно, поÑкольку Ñо Ñвоими докладами выÑтупали одни из замечательных членов Ruby-ÑообщеÑтва.

ЕÑли у Ð²Ð°Ñ Ð½Ðµ было возможноÑти лично поÑетить конференцию, то вот ÑпиÑок Ñлайдов, доÑтупных на данный момент:

"Understanding the Rails web model and scalability options", Фабиу Ðкита "Deciphering Rails 3", Грегг Поллак "Why JRuby?", Ð”ÑƒÐ³Ð»Ð°Ñ ÐšÐ°Ð¼Ð¿Ð¾Ñ
[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

MailCatcher - перехватчик почты Ð´Ð»Ñ ÑƒÐ´Ð¾Ð±Ð½Ð¾Ð¹ разработки

MailCatcher - крохотный SMTP-Ñервер, который умеет принимать почту и отображать ее Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ неÑложного веб-интерфейÑа.

Команда mailcatcher запуÑкает SMTP-Ñервер по адреÑу smtp://127.0.0.1:1025, а веб-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð¾Ñтупен тут - http://127.0.0.1:1080.

ВозможноÑти:

получает, ÑохранÑет и отображает вÑе полученные ÑообщениÑ, отображает пиÑьмо в режимах HTML, plain text и source, отображает inline-картинки, умеет отправлÑть HTML-пиÑьма во Fractal Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°, умеет отображать ÑпиÑок вложений, дает возможноÑть Ñкачать оригинал пиÑьма, чтобы проÑмотреть его в почтовом клиенте, позволÑет переопределить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа и порта Ð´Ð»Ñ Ñвоих SMTP/HTTP Ñерверов, иÑпользует WebSockets Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼ÑƒÐ½Ð¸ÐºÐ°Ñ†Ð¸Ð¸, поÑтому браузеры Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ Ñтого протокола отображают полученные пиÑьма мгновенно (Ð´Ð»Ñ Ñ‚ÐµÑ…, кто не поддерживает WebSocket ÑпиÑок пиÑем обновлÑетÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ðµ 30 Ñекунд), поддерживет нотификацию Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Growl, может работать в фоне, как демон.

ЕÑли перед вами Ñтоит задача отправки почтовых Ñообщений, то MailCatcher заÑлуживает вниманиÑ.

ПодробноÑти уÑтановки и более подробное опиÑание возможноÑти на официальном Ñайте - mailcatcher.me

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Ðебольшие корректировки в раÑпиÑании грÑдущего .тоÑтер { ruby }

Скотт Чакон (GitHub) и Блейк Мизерани (Heroku), не Ñмогут вылететь из Сан-ФранциÑко и принÑть учаÑтие в конференции. Их заменÑÑ‚ КонÑтантин Ð¥Ð°Ð·Ñ Ð¸ Ð”ÑƒÐ³Ð»Ð°Ñ ÐšÐ°Ð¼Ð¿Ð¾Ñ.

КонÑтантин, как и планировалоÑÑŒ, раÑÑкажет о Sinatra: его иÑтории, текущем ÑоÑтоÑнии и будущем фреймворка.

Ð”ÑƒÐ³Ð»Ð°Ñ Ñ€Ð°ÑÑкажет о том, почему JRuby Ñтоит иÑпользовать — прÑмо ÑÐµÐ¹Ñ‡Ð°Ñ â€” и о том, почему JRuby быÑтр, практичен, почему не Ñтоит боÑтьÑÑ JVM, почему MRI можно и нужно заменить на JRuby прÑмо ÑейчаÑ, и за Ñчет чего на JRuby можно доÑтигнуть отличных ÑкороÑтей Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ.

Ðа Ñтранице toster.ru уже доÑтупна Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° мероприÑтиÑ.

ПодробноÑти в Ñтатье "Срочно в номер!"

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Strano - UI Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Capistrano

Strano - Ñто веб-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡Ð°Ð¼Ð¸ Capistrano. Ðа данный момент работает только Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñми, хранÑщимиÑÑ Ð² GitHub.

При подключении Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ проекта Strano Ñам находит Ñкрипты Ð´ÐµÐ¿Ð»Ð¾Ñ Capistrano и читает ÑпиÑок задач из них.

ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ñех задач ÑохранÑетÑÑ, поÑтому вÑегда можно поÑмотреть что и как прошло.

Код Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ и ДжоÑль МоÑÑ (Joel Moss), автор проекта, приглашает вÑех желающих приÑоединитьÑÑ Ðº работе.

ПодробноÑти уÑтановки и другие детали в репозитории - github.com/joelmoss/strano

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Sidekiq - очередь Ñообщений, Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÑŽÑ‰Ð°Ñ Ñффективнее Resque

Sidekiq - новый игрок на поле очередей Ñообщений, реализующий в Ñвоей работе Actor model.

Sidekiq ÑовмеÑтим Resque и тоже иÑпользует Redis в качеÑтве бÑкенда. Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ñ€Ð°Ð·Ð½Ð¸Ñ†Ð° Ñ Resque в том, что Sidekiq иÑпользует многопоточноÑть при обработке Ñообщений.

Ðа данный момент возможно работа только Ñ Rails 3.

ИÑпользование

Добавить в Gemfile Ñтроку gem 'sidekiq'

Добавить воркера в каталог app/worker

class HardWorker
  include Sidekiq::Worker
  def perform(name, count)
    # do something
  end
end

Отправить Ñообщение в очередь. Ðапример, HardWorker.perform_async('bob', 5)

ЗапуÑтить команду sidekiq из каталога приложениÑ, чтобы началаÑÑŒ обработка очереди.

ПодробноÑти на Ñайте проекта - mperham.github.com/sidekiq

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

ВеÑьма «Ñерьёзный» движок

Ðа чём работает ваш блог? WordPress? LiveJournal? Jekyll? Хватит Ñто терпеть!

Ðет ничего приÑтнее, чем иметь ÑобÑтвенный standalone-блог, однако нет ничего ужаÑнее, чем заново изобретать велоÑипед.

Ðебольшой блог очень удобно веÑти при помощи обычных текÑтовых файлов, которые правильным образом обрабатываютÑÑ Ð¸ подаютÑÑ Ñ‡Ð¸Ñ‚Ð°Ñ‚ÐµÐ»ÑŽ. Ð”Ð»Ñ Ñтого идеально подходит движок Serious, но похоже, что его развитие оÑтановилоÑÑŒ (Ñто печально).

Я хочу приглаÑить вÑех желающих обратить Ñвоё внимание на Ñтот веÑьма милый инÑтрумент и призываю приÑоединитьÑÑ Ðº развитию данного проекта.

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Service Layer в Rails приложениÑÑ…

Jared Carroll опиÑывает Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ‚Ñ‚ÐµÑ€Ð½Ð°, приводит клаÑÑификацию ÑервиÑов и примеры иÑпользованиÑ.

По Ñути Ñта ÑÑ‚Ð°Ñ‚ÑŒÑ ÑвлÑетÑÑ Ð²Ñ‹Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ из книги Эрика ЭванÑа Предметно-ориентированное проектирование (DDD).

http://blog.carbonfive.com/2012/01/10/does-my-rails-app-need-a-service-layer/

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Где хранить Ñложную логику?

Как чаÑто у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°Ð»Ð¾ ощущение, что не понимаешь куда "размеÑтить" Ñложную бизнеÑ-логику?
В контроллер? Может в модель, потому что контроллер должен быть "skinny"?

Эрик Смит (Eric Smith) из 8th Light имеет Ñвое, на мой взглÑд отличное, решение Ñтого вопроÑа. Ð’ Ñтатье он не только показывает как проÑто пойти ложным путем при уÑложнении логики, но и дает рекомендации по иÑправлению Ñитуации.

Читайте "Mind Your Own Business Rails"

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

imperavi-rails - Ñто mountable engine Ð´Ð»Ñ rails 3.1+, который добавлÑет редактор Imperavi в приложение

Ð’Ñем привет! Ð’Ñе наверное видели отличненький визуальный редактор Imperavi от компании Imperavi? :) ЕÑли нет, то можно поÑмотреть здеÑÑŒ http://imperavi.com/redactor/

Так вот, Ñ Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð¾Ð²Ð°Ð» репозиторий и пытаюÑÑŒ Ñделать Ñтот редактор удобным Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Rails. ÐŸÐµÑ€Ð²Ð°Ñ Ð»Ð°Ñточка уже еÑть: https://github.com/tanraya/imperavi-rails

Ðужно некоторые вещи довеÑти до ума, напиÑать теÑты и прочее. Ðо - оно уже работает. Можно Ñ Ð¾ÑторожноÑтью пользоватьÑÑ.

Кто заинтереÑовалÑÑ Ð¸ кому надоело прикручивание tinymce и прочих редакторов в Ñвои Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ - добро пожаловать в проект, ÑтановитеÑÑŒ контрибуторами, предлагайте идеи, уÑтанавливайте редактор в Ñвои Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸ проÑто делитеÑÑŒ мнениÑми.

Я открыт Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ и обÑуждениÑ.

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

ClientSit - ошибки в JS

Прототип ÑервиÑа Ð´Ð»Ñ Ñ‚Ñ€Ñкинга клиентÑких ошибок в JS, зарегиÑтрироватьÑÑ Ð¸ получить код Ð´Ð»Ñ Ð²Ñтавки можно тут - http://clientsit.heroku.com/

можно поднÑть и Ñвой трÑкер.

но прежде читаем README на гитхабе Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ
https://github.com/homakov/ClientSit
жду ваших пул риквеÑтов )

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Ruby Hero Awards 2012

Открыто голоÑование за тех, кто доÑтоин Ð·Ð²Ð°Ð½Ð¸Ñ Ruby Hero. Ðазвать Ñвоего кандидата можно на Ñайте rubyheroes.com

Я отдал Ñвой Ð³Ð¾Ð»Ð¾Ñ Ð·Ð° Питера Купера (Peter Cooper). Рвы?

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Как правильно Ñкачивать большие файлы Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ruby?

Ð’ ÑлучаÑÑ…, когда получаемый файл имеет размеры превышающие размеры доÑтупной оперативной памÑти, нужно запиÑывать получаемый поток данных Ñразу на диÑк.

Ð’ коде Ñто выглÑдит так:

Net::HTTP.start("someurl_without_the_protocol.com") do |http|
  begin
    file = open("/path/to/file.mov", 'wb')
    http.request_get('/' + URI.encode("file.mov")) do |response|
      response.read_body do |segment|
        file.write(segment)
      end
    end
  ensure
    file.close
  end
end

Пример кода и Ñовет из Ñтатьи "Large Ruby File Downloads Done Right!"

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Ruby on Rails Google+

ÐовоÑти фреймворка, технологий ÑвÑзанных Ñ Ruby on Rails и обзор гемов на Ñтранице I18n.locale = :ru

[image] [image] [image] [image]
[image]
ИÑточник: rubyflow.ru

Вход Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹

Ðе подтвержденные новоÑти

Ðовые пользователи


You are viewing a mobilized version of this site...
View original page here

Mobilized by Mowser Mowser