Идеальный вариант, это когда рельсы такие как есть, но написаны вами самостоятельно с нуля.
среда, 29 марта 2017 г.
Про Рельсы философское
Идеальный вариант, это когда рельсы такие как есть, но написаны вами самостоятельно с нуля.
среда, 25 января 2017 г.
Про Docker и Ruby on Rails sprockets and precompiled assets.
По-хорошему монолит на рельсах нужно дробить, а то получается 1С:Бухгалтерия, со всеми включенными галочками по-умолчанию. В данном случае умолчания в рельсах слишком greedy.
Взять вот sprockets. Его задача вообще один раз запуститься, минифицировать css и js, и замолчать навеки. При этом он требует кучу разнообразных зависимостей типа execjs, nodejs или v8 от гугла в качестве движка минификации.
Но что делает фреймворк? Sprockets включают в Gemfile, он грузится вместе с полезным кодом, занимает кучу места, мешается под ногами и заставляет программиста танцевать с бубном вокруг задач связанных с деплоем!
Как было бы делать правильно? Минификацию JS и CSS отрезать и делать ее опциональной, отдельной утилитой, если хотите, в составе рельс. Такой же как и rake. Назвать ее minirake и дать набор ключей для запуска. Но! У нас по всему фреймворку нужно протянуть новые названия файлов, которые генерятся при минификации! Потому что как же нам еще разделить код и данные? Короче, считаю это ошибкой дизайна, когда оптимизация НАВЯЗАНА разработчику, то есть для 99% сайтов она будет делаться ПРЕЖДЕВРЕМЕННО.
Тоже самое можно сказать и про turbolinks. Во-первых очень мало народу понимает как оно в реальности работает, соответственно каких косяков ожидать. Это та же самая, мать ее, premature optimization. Всегда гораздо сложнее упрощать что-то сложное, чем добавлять и ускорять по мере необходимости.
Поэтому когда мы логичным образом переходим на деплой рельсового приложения докером, встречаемся лицом к лицу с этими неоптимальными вещами. Идеальный случай - отдельным контейнером разово запускать минификатор, он отработал свое, закрылся и все, до следующего раза. Но нет, в рельсах все приколочено гвоздями к потолку.
И вот здесь детальнее, о чем я имею в виду https://blog.red-badger.com/blog/2016/06/22/docker-and-assets-and-rails-oh-my
вторник, 24 января 2017 г.
Вот сегодня запиливая очередной апдейт в простеньком Ruby on Rails сайте я понял
Миграции как в рельсах для Clojure
- Drift - Drift is a migration library written in Clojure. Drift works much like Rails migrations where a directory in your project contains all of the migration files. Drift will detect which migration files need to be run and run them as appropriate.
- Lobos - Lobos is a SQL database schema manipulation and migration library written in Clojure. It currently support supports H2, MySQL, PostgreSQL, SQLite and SQL Server.
- Ragtime - a general migration framework, with an implementation for database migrations.
- Joplin - Joplin is a library for flexible datastore migration and seeding
пятница, 11 ноября 2016 г.
четверг, 27 октября 2016 г.
вторник, 20 октября 2015 г.
Как сделать rebuild для ThinkingSphinx в resque-scheduler
Вот хорошее описание кейса на тостере:
Очень много танцев с бубном, и вот мой cron остался только для запуска переиндексации сфинкса.
однако вот такой джоб раз в полчаса делает свою работу:
class ReindexThinkingSphinxJob < ActiveJob::Base
queue_as :ts
def perform(*args)
config = ThinkingSphinx::Configuration.instance
config.controller.index :verbose => true
end
end
в resque-schedule.yml добавляем
ReindexThinkingSphinxJob:
every:
- '30m'
description: "Reindex for thingin sphinx"
queue: ts
пятница, 9 октября 2015 г.
Запилил Server Side Events на Rails 4.0
Несколько косяков.
1. Нужен сервер с поддержкой SSE. В моем случае это Puma.
2. Если не включить config.cache_classes = true и config.eager_load = true, то работать не будет, будет вечное ожидание отработки контроллера вызываемого через events.
P.S. Эта проблема решается включением опции Just add config.allow_concurrency = true to your development.rb.
3. При включении опций, указанных выше, есть проблема с автоматической подгрузкой измененного кода. Нужно останавливать вебсервер и заново его запускать, что, конечно, замедляет разработку.
Мои эксперименты закончились вот таким небольшим контроллером:
class Api::EventsController < ApplicationController
include ActionController::Live
skip_before_filter :authenticate_account!, only: [:index]
def index
response.headers["Content-Type"] = "text/event-stream"
redis = Redis.new
redis.psubscribe('tickets.*') do |on|
on.pmessage do |pattern, event, data|
response.stream.write "event: #{event}\n"
response.stream.write "data: #{data}\n\n"
end
end
rescue IOError
logger.info "stream closed"
ensure
redis.quit
response.stream.close
end
end
пятница, 25 сентября 2015 г.
Более простой способ генерить class: "active" для активного контроллера
так что нашел хорошим способ делать так (для HAML)
%li{class: (request.path.include?(incidents_path) && "active")}
выставит у
пятница, 8 мая 2015 г.
Rails 4.1+ не нужен Timecop для тестиррования
ActiveSupport::Testing::TimeHelpers#travel
Time.travel 1.day Time.travel -1.day Time.travel 1.day do User.create.created_at # => 1 day from now end Time.travel_to Time.new(2004, 11, 24, 01, 04, 44) Time.travel_to Date.new(2004, 11, 24) Time.travel_to Time.new(2004, 11, 24, 01, 04, 44) do User.create.created_at # => 2004-11-24 01:04:44 -0500 end
вторник, 27 августа 2013 г.
пятница, 23 августа 2013 г.
Has many through polymorphic association
http://stackoverflow.com/questions/6997141/rails-has-many-through-with-polymorphic-association-will-this-work
Как сделать OR вместо AND в запросах Rails?
http://stackoverflow.com/questions/3684311/rails-how-to-chain-scope-queries-with-or-instead-of-and
вторник, 20 августа 2013 г.
Array of arrays flatten
Внезапно узнал про метод flatten у array
http://stackoverflow.com/questions/8282096/ruby-how-to-concatenate-array-of-arrays-into-one
вторник, 16 апреля 2013 г.
пятница, 18 января 2013 г.
Делать линки в тексте
Можно делать через gsub, а можно, по-спортивному через auto_link, который выпал в отдельный джем.
Впрочем: моднее подключать gem 'rinku'
четверг, 17 января 2013 г.
о пользе чтения документации
Узнал, что можно делать и такое:
cycle('a1','a2') будет поочередно показывать то a1, то a2 в цикле
excerpt выкусит из большого текста нужный кусок с окружающими словами, что полезно при поиске
highlight поможет выделить кусок в тексте и обрамить его в :highlighter блок
word_wrap поможет разбить текст кусками по n символов и вставить \n\n между кусками
You can also supply an alternate image to show on mouseover:
<%= image_tag "home.gif", :onmouseover => "menu/home_highlight.gif" %> |
понедельник, 14 января 2013 г.
Ну я как знал, что наступит западло
Только собрался засекьюрить Rails XML hole путем обновления версии, как пошло и поехало.
Короче, тронул версию, тут проснулся Paperclip и стал требовать новую версию, а она уже под 1.8.7 не собирается.
Тьфу, пришлось на старых рельсах затыкать дыры путем
ActionController::Base.param_parsers.delete(Mime::XML)
вторник, 8 января 2013 г.
jQuery + coffeescript
Из документации:
As a shortcut for this.property, you can use @property.
так что можно писать и так:
@find('a').after('test')
вместо
$(this).find('a').after('test')