Veerasundaravel's Ruby on Rails Weblog

January 28, 2013

Kill a program using Ruby

Filed under: Ruby, Ruby On Rails — Veerasundaravel @ 12:54 pm

Old school but helpful.

Get process id of a running program and kill it if you need.

pid = `pgrep -f “ruby running_program.rb”`.split(“\n”).first.to_i
`kill -9 #{pid}`

Specify your program or script name inside the double quotes instead of ruby running_program.rb. It will return the pid of the program and you can get it in the variable pid. In next line you can see the kill command in order to kill the program.

July 25, 2012

Rspec Shoulda-Matcher made Unit testing as easier one

Filed under: Rails3, Ruby, Ruby On Rails, Testing, Unit Test — Tags: , , , , , , — Veerasundaravel @ 12:37 am

Shoulda matcher is a library that enables to write better and more understandable tests for Rails application. It is Test::Unit- and RSpec-compatible one-liners that test common Rails functionality.

Here few very easier example of shoulda-matchers for Unit Testing.

Test model fields:

it {should have_db_column(:login)}
it {should have_db_column(:salary).of_type(:decimal).with_options(:precision => 10, :scale => 2) }
it { should_not have_db_column(:admin).of_type(:boolean) }

Test db indexes:

it { should have_db_index(:age) }
it { should have_db_index([:commentable_type, :commentable_id]) }
it { should have_db_index(:ssn).unique(true) }

Test validations:

it { should validate_uniqueness_of(:title) }
it { should validate_presence_of(:body).with_message(/Enter the message/) }
it { should validate_presence_of(:title) }
it { should validate_numericality_of(:user_id) }
it { should validate_uniqueness_of(:title) }
it { should_not allow_value("blah").for(:email) }
it { should allow_value("a@b.com").for(:email) }
it { should ensure_inclusion_of(:age).in_range(1..100) }
it { should_not allow_mass_assignment_of(:password) }

Test associations:

it { should belong_to(:parent) }
it { should have_one(:car)
it { should have_many(:friends) }
it { should have_many(:enemies).through(:friends) }

 

Further reading:

Shoulda-Matcher home page -  https://github.com/thoughtbot/shoulda-matchers/
Shoulda-context home page – https://github.com/thoughtbot/shoulda-context/
rspec_shoulda cheat sheet – http://cheat.errtheblog.com/s/rspec_shoulda/

 

August 9, 2011

Rails ActionMailer – Use multipart/alternative as content_type of email


Rails uses plain/text as the default content_type for sending email, you can change it to text/html that email clients can display html formatted email.

But not all the email clients support html format well, we should make our sent emails support both plain text and html format for different email clients.

text/plain:

By default Rails sending an email with plain/text content_type, for example

# app/models/notifier.rb
def send_email(email)
  subject       email.subject
  from          email.from
  recipients    email.recipients
  sent_on       Time.now
  body          :email => email
end

# app/views/notifier/send_email.html.erb
Welcome to here: <%= link_to @email.url, @email.url %>

The sent email is a plain text email

Date: Tue, 9 Aug 2011 16:38:07 +0800
From: VeeraaWP <veeraa@wordpress.com>
To: some-user@gmail.com
Mime-Version: 1.0
Content-Type: text/plain; charset=utf-8

Welcome: <a href="http://veerasundaravel.wordpress.com">http://veerasundaravel.wordpress.com</a>

The link url is just displayed as a plain text because of the email content_type.

text/html:

If we want the email clients to display link url as html format, we should change the content_type to text/html.

# app/models/notifier.rb
def send_email(email)
  subject       email.subject
  from          email.from
  recipients    email.recipients
  sent_on       Time.now
  content_type     "text/html"
  body          :email => email
end

# app/views/notifier/send_email.html.erb
Welcome to here: <%= link_to @email.url, @email.url %>

Now the sent email is a html formatted email

Date: Tue, 9 Aug 2011 16:38:07 +0800
From: VeeraaWP <veeraa@wordpress.com>
To: some-user@gmail.com
Mime-Version: 1.0
Content-Type: text/plain; charset=utf-8

Welcome: <a href="http://veerasundaravel.wordpress.com">http://veerasundaravel.wordpress.com</a>

Now the email client can display the link url correctly with html format.

multipart/alternative:

But we can’t promise that all the email clients support the html format and some users will set the email client to display plain text email instead of html formatted email. How should we do?

We should use multipart/alternative as email content_type to support both text/plain and text/html emails.

# app/models/notifier.rb
def send_email(email)
  subject          email.subject
  from             email.from
  recipients       email.recipients
  sent_on          Time.now
  content_type     "multipart/alternative"

  part :content_type => "text/html",
    :body => render_message("send_email_html", :email => email)

  part "text/plain" do |p|
    p.body = render_message("send_email_plain", :email => email)
    p.transfer_encoding = "base64"
  end
end

# app/views/notifier/send_email_html.erb
# app/views/notifier/send_email_plain.erb

As you see, we can set the email content_type to multipart/alternative, then define content_type text/html render the file app/views/notifier/send_email_html.erb and content_type text/plain render the file app/views/notifier/send_email_plain.erb. So the sent email is as follows

Date: Tue, 9 Aug 2011 16:17:35 +0800
From: VeeraaWP <veeraa@wordpress.com>
To: some-user@gmail.com
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary=mimepart_4c5a739f40ca1_967c1a0d6123

--mimepart_4c5a739f40ca1_967c1a0d6123
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: Quoted-printable
Content-Disposition: inline

Welcome: <a href="http://veerasundaravel.wordpress.com">http://veerasundaravel.wordpress.com</a>

--mimepart_4c5a739f40ca1_967c1a0d6123
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: Quoted-printable
Content-Disposition: inline

Welcome: <a href="http://veerasundaravel.wordpress.com">http://veerasundaravel.wordpress.com</a>

--mimepart_4c5a739f40ca1_967c1a0d6123--

As you see, the content_type of email is multipart/alternative now, and the body of email is divided into two parts, one is for text/plain, the other is for text/html. So email clients can decide which format of email to display.

Convention:

It’s cool, but can the codes be simpler? Of course, there is a convention to simplifier the multipart/alternative content_type

def send_email(email)
  subject          email.subject
  from             email.from
  recipients       email.recipients
  sent_on          Time.now
  body             :email => email
end

# app/views/notifier/send_email.text.plain.erb
# app/views/notifier/send_email.text.html.erb

Please note the file extensions for notifier send_email method, one is .text.plain.erb, the other is .text.html.erb, they are the email views for text/plain and text/html according to their names. ActionMailer will detect the file extension, if .text.plain and .text.html exist, the content_type of email will be set to multipart/alternative automatically.

In rails3: the mail view file names should be send_email.html.erb and send_email.text.erb


Related articles:

Rails, email and multipart/alternative (olddognewtricks.co.uk)
Rails Best Practices (rails-bestpractices.com)

Older Posts »

Theme: Silver is the New Black. Blog at WordPress.com.

Follow

Get every new post delivered to your Inbox.

Join 109 other followers

%d bloggers like this: