Never been to CodeSnippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world (or not, you can keep them private!)

Two or more parameters in RESTful route

Regardless of whether this is RESTful, to add multiple parameters to a normally RESTful route use the following

myresource_path(:id => myId, :extra_param => extraId, :extra_param2 => blah)


Results in
myresource/myId?extra_param=extraId&extra_param2=blah


See this Google Rails Group thread from Jeremy Kemper.

acts_as_state_machine model

// ActiveRecord plugin for managing state changes
// elitists.textdriven.com/svn/plugins/acts_as_state_machine/

class Something < ActiveRecord::Base

  # Validations
  validate :validate_state_change

  # State Machine States
  acts_as_state_machine :initial => :new
  state :new
  state :enabled,   :after => :after_enabled
  state :disabled,  :after => :after_disabled

  # State Machine Events
  event :enabled do
    transitions :from => :new,      :to => :enabled
    transitions :from => :disabled, :to => :enabled
  end
  
  event :disabled do
    transitions :from => :new,      :to => :disabled
    transitions :from => :enabled,  :to => :disabled
  end

  # Instance Methods
  def validate_state_change
    return if new_record?
    old = self.class.find(id)
    old_state = old.state
    new_state = self.state
    self.state = old_state
    if old_state != new_state
      begin
        if self.method("#{new_state}!").call != true
          errors.add(:state, "cannot transition from #{old_state} to #{new_state}")
        end
      rescue NameError
      end
      self.state = new_state
    end
  end
end

Restart Rails on Dreamhost

script/process/reaper --dispatcher=dispatch.fcg

Freezing Rails

rake rails:freeze:edge TAG=rel_1-2-6

SOAP4R Rails NameError FIX

// description of your code here

Update /Library/Ruby/Gems/1.8/gems/soap4r-1.5.8/lib/soap
  # KNOWN_TAG = XSD::NS::KNOWN_TAG.dup.update(
  #   SOAP::EnvelopeNamespace => 'env'
  # ) # Replaced with code from http://dev.ctor.org/soap4r/ticket/433
  KNOWN_TAG = {
      XSD::Namespace => 'xsd', XSD::InstanceNamespace => 'xsi', SOAP::EnvelopeNamespace => 'env'
  }

Freeze rails

Freeze rails 1.2.3 to a project through rubyonrails.org TRAC.

rake rails:freeze:edge TAG=rel_1-2-3

Static Pages in Rails without Corresponding Controllers

// See if a file exists on a path provided by a record in your database

def show
	page_url = params[:url].join('/')
	if File.exists?("#{RAILS_ROOT}/app/views/pages/#{page_url}")
		render :template => "static/#{page_url}"
        end
end

old deprecated legacy plugins repository for Rails

// description of your code here

Find old official rails trunk plugins that didn't make the cut here:

http://dev.rubyonrails.org/svn/rails/plugins/legacy/

rails console - add module methods

Extend the functionality of the rails console by mixing in modules

>> extend ERB::Util
=> #<Object:0x2572f68>
>> h('<b>blahblah</b>')
=> "&lt;b&gt;blahblah&lt;/b&gt;"


You can extend ActionView::Helpers, etc. with this to provide view method functionality in the console.

http://errtheblog.com/post/43

Capistrano task to load production data

# load production data, still needs some polish
# based on code from http://push.cx/2007/capistrano-task-to-load-production-data
# cap 2.0 compatible
# exec is being weird, had to end w/ a syscall :\ any ideas?

desc "Load production data into development database"
task :load_production_data, :roles => :db, :only => { :primary => true } do
  require 'yaml'
  ['config/database.yml'].each do |file|

    database = YAML::load_file(file)

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

    # run "mysqldump -u #{database['production']['username']} --password=#{database['production']['password']} #{database['production']['database']} > /tmp/#{filename}" do |channel, stream, data|
    run "mysqldump -h #{database['production']['host']} -u #{database['production']['username']} --password=#{database['production']['password']} #{database['production']['database']} | gzip > /tmp/#{filename}" do |channel, stream, data|
      puts data
    end
    get "/tmp/#{filename}", filename
    # exec "/tmp/#{filename}"
    password = database['development']['password'].nil? ? '' : "--password=#{database['development']['password']}"  # FIXME pass shows up in process list, do not use in shared hosting!!! Use a .my.cnf instead
    # FIXME exec and run w/ localhost as host not working :\
    # exec "mysql -u #{database['development']['username']} #{password} #{database['development']['database']} < #{filename}; rm -f #{filename}"
    `gunzip -c #{filename} | mysql -u #{database['development']['username']} #{password} #{database['development']['database']} && rm -f gunzip #{filename}`
  end
  
end