Ordnung im Helper-Chaos

Aug 2007
29

0 Kommentar(e)

Eingetragen von Martin Maciaszek

Standardmäßig legt script/generate für jeden Controller einen gleichnamigen Helper an. Oft sind die Helper jedoch nicht nur für einen speziellen Controller gedacht. Da ist man schnell gewillt, diese Helper alle in den application_helper.rb zu schreiben. Das führt aber ganz schnell zu einer riesigen und unübersichtlichen application_helper.rb-Datei. Es geht auch anders.

Ich ordne meine Helper lieber thematisch. So habe ich einen menu_helper.rb, video_helper.rb und einen translate_helper.rb in meinem app/helpers-Verzeichnis. Um nun den VideoHelper benutzen zu können, schreibe ich in den entsprechenden Controller (oder in den ApplicationController, wenn der Helper für alle Controller verfügbar sein soll) folgende Zeile:

helper :video

Die nun unbenutzten Helper sowie die dazugehörigen Tests, die von script/generate angelegt wurden, können gefahrlos gelöscht werden.


Statische Verzeichnisse nach Deployment

Aug 2007
29

0 Kommentar(e)

Eingetragen von Martin Maciaszek

Da ich gerade so richtig im Schwung bin mit Capistrano, hier noch ein Paar Tasks, welche beim deploy:setup und deploy:cold sowie deploy zusätzliche Verzeichnisse in die Anwendung symlinken. Im Code ist es beispielsweise ein Upload-Verzeichnis, was nach jedem Deployment erhalten bleiben sollte. Die Verzeichnisse lassen sich bequem per :common_dirs konfigurieren.

set :common_dirs, ['public/uploads']

namespace :deploy do
  desc "symlink additional directories on server"
  task :symlink_more do
    unless fetch(:common_dirs, []).empty?
      fetch(:common_dirs).each do |dir|
        run "rm -rf #{release_path}/#{dir} &&\
              ln -nfs #{shared_path}/#{dir} #{release_path}/#{dir}"
      end
    end
  end

  desc "Prepares additional directories on server for deployment"
  task :setup_more do
    unless fetch(:common_dirs, []).empty?
      dirs = fetch(:common_dirs).map { |d| File.join(shared_path, d)}
      run "umask 02 && mkdir -p #{dirs.join(' ')}"
    end
  end

  after "deploy:finalize_update", "deploy:symlink_more"
  after "deploy:setup", "deploy:setup_more"
end

Spin-Skript für Capistrano

Aug 2007
28

0 Kommentar(e)

Eingetragen von Martin Maciaszek

Die aktuelle Doku zu Capistrano beschreibt hier, daß im script/spin-Skript der Pfad zum script/process/spawner absolut angegeben werden sollte. Doch ein Blick beim Deploy selbst verrät, daß dies gar nicht nötig ist. Ich bin auf folgende Zeile dabei gestoßen:

  * executing `deploy:start'
  * executing "sh -c 'cd /usr/local/www/my_app/current && nohup script/spin'"

Es reicht also aus, wenn der Pfad zum script/process/spawner in script/spin relativ zum RAILS_ROOT angegeben ist. Mein Skript sieht hier beispielsweise so aus.

#!/bin/sh
script/process/spawner -a 127.0.0.1 -p 11000 -i 3

Datenbankkonfiguration nach Deployment

Aug 2007
28

0 Kommentar(e)

Eingetragen von Martin Maciaszek

Da ich die Datenbankkonfiguration database.yml nicht in der Revisionsverwaltung halte, muß ich sie nach dem Deployment mit Capistrano separat hochladen. Folgender Task in der deploy.rb erledigt dies automatisch.

namespace :deploy do
  desc "upload database configuration"
  task :add_database_configuration, :roles => :web do
    run "mkdir -p #{shared_path}/config"
    config = File.read(File.join(File.dirname(__FILE__), "database.yml"))
    put config, "#{shared_path}/config/database.yml"
    run "ln -s #{shared_path}/config/database.yml \
          #{latest_release}/config/database.yml"
  end

  after "deploy:finalize_update", "deploy:add_database_configuration"
end

Besser highlighten dank CodeHighlighter

Aug 2007
27

0 Kommentar(e)

Eingetragen von Martin Maciaszek

Mephisto bringt zwar einen eigenen Code-Highlighter mit, doch es geht auch einfacher. CodeHighlighter erledigt dies alles Clientseitig mit Javascript. Ich empfehle die ruby.js gegen folgenden Code auszutauschen.

CodeHighlighter.addStyle("ruby",{
    comment : {
        exp  : /#[^\n]*/
    },
    brackets : {
        exp  : /\(|\)|\[|\]|\{|\}/
    },
    string : {
        exp  : /'[^']*'|"[^"]*"/
    },
    keywords : {
        exp  : /\b(do|end|self|class|def|if|module|yield|then|else|for|until|unless|while|elsif|case|when|break|retry|redo|rescue|require|raise)\b/
    },
    constants : {
      exp  : /\b(true|false|__[A-Z][^\W]+|([A-Z]\w+::)*[A-Z]\w+)\b/
    },
    symbol : {
      exp  : /:[^\W]+/
    },
    instance : {
      exp  : /@+[^\W]+/
    },
    method : {
      exp  : /[^\w]*\.(\w*)[!?]*/
    }
});