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.
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
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
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
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*)[!?]*/
}
});