Показаны сообщения с ярлыком rails. Показать все сообщения
Показаны сообщения с ярлыком rails. Показать все сообщения

четверг, 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" %>

понедельник, 17 декабря 2012 г.

Пачка багов при траблшутинге Capistrano+RVM+Unicorn+Apache2-Passenger на FreeBSD

Итак, при очередном деплое на FreeBSD было решено добиться автоматизированной взаимности от Capistrano в неожиданной конфигурации.

 

Для того, что бы использовать разные версии руби (1.9.3 например) мне пришлось использовать вместо удобного Passenger неудобный Unicorn.

Для отладки использован multistage в виде строки 

require 'capistrano/ext/multistage'

в deploy.rb

и в виде конфигов в config/deploy/xxxxxx.rb для каждого случая (у меня staging, aws, colo)

 

баг возник неожиданно, капистрано не распознавал deploy_to, что решил stackoverflow http://stackoverflow.com/questions/8213376/capistrano-multistage-deploying-to-wrong-directory

 

каждый файл должен содержать 

set(:deploy_to){ "/var/www/#{application}" }

set(:releases_path)     { File.join(deploy_to, version_dir) }

set(:shared_path)       { File.join(deploy_to, shared_dir) }

set(:current_path)      { File.join(deploy_to, current_dir) }

set(:release_path)      { File.join(releases_path, release_name) }

а конструкция 

set :deploy_to, "/var/www/#{application}" попросту не работала :(

======================================================================

Запуск на colo (FreeBSD) закончился удачно, но авторизация OAuth слетала с известной SSL багой, которая вылечилась скачиванием ca-bundle.crt в config приложения, и с указанием на нее в config/initializers/device.rb

config.omniauth :google_oauth2, "xxxxx", "yyyyyyyyyy", { :access_type => "offline", :approval_prompt => "", :client_options => { :ssl => { :ca_file => "#{Rails.root}/config/ca-bundle.crt" }}}

======================================================================

 

к Апачу unicorn подключили как балансер по http, через unix socket Unicorn с апачем не работает

что описано здесь http://stackoverflow.com/questions/5780886/proxy-apache-load-balancers-to-a-unix-socket-instead-of-a-port

<VirtualHost *:80>

        ServerName itservice

        DocumentRoot /www/itservice/current/public

<Proxy balancer://unicornservers>

   BalancerMember http://127.0.0.1:9000

</Proxy>

ProxyRequests Off

ProxyPass /assets/ !

ProxyPass / balancer://unicornservers/

ProxyPassReverse / balancer://unicornservers/

ProxyPreserveHost on

</VirtualHost>

=====================================================================
Столкнулся с тем, что Capistrano даже в другом namespace таски с названием upload и download не работают
я хотел db:upload и db:download, однако херъ. Получил забавные баги.
 
переименование в upload_production и download_production помогло
=====================================================================
RVM в системном виде бывает "не может переключить"  на другой ruby, это лечится
в  .bash_profile
 
[[ -s "/usr/local/rvm/scripts/rvm" ]] && . "/usr/local/rvm/scripts/rvm"
========================================================================
Passenger запускался автоматически апачем что было волшебно и ненавязчиво, Unicorn подобного не умеет и для него приходится руцями делать скрипты запуска для каждого сайта отдельно. Как в старые добрые допассажировские времена.
И запускать их при старте.
 
Для этого люди не поленились написать этот GIST
 
Тот еще способ.
set(:releases_path){File.join(deploy_to, version_dir)}set(:shared_path){File.join(deploy_to, shared_dir)}set(:current_path){File.join(deploy_to, current_dir)}set(:release_path){File.join(releases_path, release_name)}

вторник, 18 сентября 2012 г.

Замечательный пример acts_as_taggable_on и rails3-jquery-autocomplete

рулит и бибикает применение двух гемов для функционала "теги с автокомплитом"
 

http://stackoverflow.com/questions/4486745/rails-autocomplete-tags-separated-by-commas-using-regex

четверг, 8 декабря 2011 г.

UPDATED: Загрузка mysql из production mysql в development

слегка модифицирован http://www.snippetstash.com/public/9


# Fetches the production database on the server contents into the development
 # database
 #
 # Assumes you have dbuser, dbhost, dbpassword, and application defined somewhere in your
 # task. Modify as needed - database.yml is used for importing data, just not for exporting.
 #
 # Only supports MySQL.
 desc "Load production data into development database"
 task :fetch_remote_db, :roles => :db, :only => { :primary => true } do
   require 'yaml'

   database = YAML::load_file('config/database.yml')

   filename = "dump.#{Time.now.strftime '%Y-%m-%d_%H:%M:%S'}.sql"

   on_rollback do
     delete "/tmp/#{filename}"
     delete "/tmp/#{filename}.gz"
   end

   cmd = "mysqldump -u #{database['production']['username']} --password=#{database['production']['password']} #{database['production']['database']} > /tmp/#{filename}"
   puts "Dumping remote database"
   run(cmd) do |channel, stream, data|
     puts data
   end

   # compress the file on the server
   puts "Compressing remote data"
   run "gzip -9 /tmp/#{filename}"
   puts "Fetching remote data"
   get "/tmp/#{filename}.gz", "dump.sql.gz"

   # build the import command
   # no --password= needed if password is nil.
   if database['development']['password'].nil?
     cmd = "/usr/local/mysql/bin/mysql -u #{database['development']['username']} #{database['development']['database']} < dump.sql"
   else
     cmd = "/usr/local/mysql/bin/mysql -u #{database['development']['username']} --password=#{database['development']['password']} #{database['development']['database']} < dump.sql"
   end

   # unzip the file. Can't use exec() for some reason so backticks will do
   puts "Uncompressing dump"
   `gzip -d dump.sql.gz`
   puts "Executing : #{cmd}"
   `#{cmd}`
   puts "Cleaning up"
   `rm -f dump.sql`

   puts "Be sure to run rake db:migrate to ensure your database schema is up to date!"
 end


UPDATED: еще один старый recipe для capistrano


desc "Load production data into development database"
task :load_production_data, :roles => :db, :only => { :primary => true } do
  require 'yaml'

  database = YAML::load_file('config/database.yml')

  filename = "dump.#{Time.now.strftime '%Y-%m-%d_%H:%M:%S'}.sql"
  on_rollback { delete "/tmp/#{filename}" }

  run "mysqldump -u #{database['production']['username']} --password=#{database['production']['password']} #{database['production']['database']} > /tmp/#{filename}" do |channel, stream, data|
    puts data
  end
  get "/tmp/#{filename}", filename
#  exec "/tmp/#{filename}"
  exec "mysql -u #{database['development']['username']} --password=#{database['development']['password']} #{database['development']['database']} < #{filename}; rm -f #{filename}"
end