Notes on ScopePort

Ruby On Rails

How to use Rails SMTP configuration parameters from database

by Lennart on Jul.26, 2009, under Ruby On Rails

Usually the Rails SMTP configuration takes place in config/environment.rb like this:

ActionMailer::Base.smtp_settings = {
  :address => "smtp.gmail.com",
  :port => 587,
  :domain => "domain.com",
  :user_name => "user@domain.com",
  :password => "password",
  :authentication => :plain
}

ScopePort already has a Email settings part in the setup section where all the required SMTP settings are stored. I wanted to fetch the SMTP configuration from the database to avoid double configuration. I stumbled over this blog post after a while: http://broadcast.oreilly.com/2009/03/using-multiple-smtp-accounts-w.html Based on this I developed the following dynamic way to define the SMTP settings:

class EmergencyMailer < ActionMailer::Base   
  def load_settings
    @@smtp_settings = {
      :address => Setting.first.mail_server,
      :port => Setting.first.mail_port,
      :domain => Setting.first.mail_hostname,
      :authentication => :plain,
      :user_name => Setting.first.mail_user,
      :password =>Setting.first.mail_pass
    }
  end
 
  def emergency_notification(emergency, email)
    load_settings
    recipients  email
    from        Setting.first.mail_from
    subject     "[ScopePort] An emergency has been declared!"
    sent_on     Time.now
    body        :emergency => emergency
  end
end

The method load_settings gets called by the delivery method and fills the smtp_settings instance variable with parameters from the database.

Check out this Rails Guide if you want to learn more about ActionMailer: http://guides.rubyonrails.org/action_mailer_basics.html

1 Comment :, , , , , , more...

RailsConf 2009 review video

by Lennart on Jun.10, 2009, under Ruby On Rails

Greg Pollack created a 34 minutes video that shows the RailsConf 2009 speakers.

Leave a Comment :, , , more...

Phusion Passenger error “No such file or directory – /nonexistent”

by Lennart on Jan.09, 2009, under Ruby On Rails

When you try to start your Rails application with Passenger/Apache and get an error like “No such file or directory – /nonexistent” make sure that your config/environment.rb file is not owned by root or nobody. Change the owner to e.g. www-data!

7 Comments :, , , , , , , , more...

How to use the GitHub post-receive JSON API with Rails

by Lennart on Nov.21, 2008, under Ruby On Rails

GitHub offers you a lot of post-receive notifications. This means that some actions are made whenever you commit something. You can e.g. send notifications via Jabber or IRC – Another option is to call a URL with JSON data. This Rails snippet receives the JSON data and stores relevant information in your database:

class TunerController < ApplicationController

	# Basic HTTP authentication.
	USER, PASSWORD = "github", "secret"
	before_filter :authenticate

	# Disable need of authenticity token.
	skip_before_filter :verify_authenticity_token

	def index
		# Include JSON. (gem install json)
		require 'json'

		# Check if the JSON request is in correct format.
		if params[:payload].blank?
			# Wrong format. Exit.
			render :text => "no payload"
			return
		end

		# Parse the JSON request and store resulting hash.
		push = JSON.parse(params[:payload])

		# Get the "commits" part.
		commits = push["commits"]

		# Check if there were commits. Yes, there should be some...
		if commits.blank?
			# No commits found. Strange - Exit!
			render :text => "no commits found"
			return
		end

		# Store the interesting information of the last commit-
		last_commit_message = commits.last["message"]
		last_commit_timestamp = commits.last["timestamp"]
		last_commit_author = commits.last["author"]["name"]

		# Create a new object to save in databse.
		data = Git_Message.new do |d|
			d.last_commit_message = last_commit_message
			d.last_commit_timestamp = last_commit_timestamp
			d.last_commit_author = last_commit_author
		end

		# Save our commit data in the database!
		if !data.save
			# Could not save.
			render :text => "could not store in database"
			return
		end

		# Everything went well.
		render :text => "done"
	end

	private

	def authenticate
		authenticate_or_request_with_http_basic "nothing to see here"
                  do |id, password|
			id == USER && password == PASSWORD
		end
	end

end

Set the GitHub post-receive URL to something like http://github:secret@example.org/tuner – Where “github” is the user and “secret” the password. You can alternatively just enter the URL and remove the authentication methods from the Rails controller.

Leave a Comment :, , , , , , , , , , more...

How to add a value to a select field in Ruby On Rails

by Lennart on Nov.15, 2008, under Ruby On Rails

I’ll just leave this here: When you fill a select box directly from a array returned by .find(:all) you can add more values tothe select box this way:

Controller:

    @hosts = Host.find(:all).collect {|p| [p.name, p.id] }
    @hosts << ["None", nil]

View:

    <dd>
      <%= f.select :linkedhost, @hosts %>
      <%= error_message_on(:service, :linkedhost) %>
    </dd>
Leave a Comment :, , , , , more...

Rails Migrations: How to define an own column as primary key

by Lennart on Nov.09, 2008, under Ruby On Rails

Usually the Ruby On Rails convention to use ID as the primary key of tables is fine. But sometimes you want to use another column as primary key. In my case I wanted to use the column “pid” of the ScopePort table “health” as the primary key. This is the way to do it:

def self.up
  create_table :health, :primary_key => :pid do |t|
    t.integer :threads, :timestamp
    t.boolean :clienthandler
    t.string :vmem, :packetsOK, :packetsERR
  end
end

The first notable point is the create_table option “:primary_key => :pid”. It instructs rake not to create the ID column but to use the column “pid” as primary key. You don’t need to define :pid later – It will be created automatically as an integer.

Leave a Comment :, , , , more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!