How to categorise a blog posts data by month in Ruby On Rails

Suppose we have created a ‘BlogPost’ Model in Rails and it have the following fields in a blog post:

title – title of the blog post
posted_on – date posted
permalink – a permanent link of each blog post (act as a primary key)
publish – a boolean field which decides the post need to show or not

Lets write a method in ‘BlogPost’ Model to get a recent list of posts.
Pass a โ€˜months_oldโ€™ parameter to determine how much months old posts we wanted to list.
Just select the required columns to show the details of the post (by โ€˜:select => โ€˜). And Group each post by posted month.

  def self.get_recent_months_post(months_old)
    @blog_posts = where("publish = ? AND posted_on > ?", true, Date.today - months_old.months).all(:select => "title, posted_on, permalink", :order => "posted_on DESC")
    (@blog_posts.group_by { |t| t.posted_on.beginning_of_month }).sort.reverse
  end

We successfully written the method above. Now lets write a method to get the archives (old posts).

  def self.get_archives(old)
    @blog_posts = where("publish = ? AND posted_on  "title, posted_on, permalink", :order => "posted_on DESC")
    (@blog_posts.group_by { |t| t.posted_on.beginning_of_month }).sort.reverse
  end

An Example for the difference between class and instance variable in Ruby

Create a ruby class called Test

class Test
   def cv=(value)
     @@cv = value
     end
   def cb=(value)
     @cb = value
     end
   def cv
     @@cv
     end
   def cb
     @cb
     end
   end
 => nil 

Then create an instance of this class a and b

Try accessing the class variable without initializing it.

a = Test.new
 => # 
 a.cv
NameError: uninitialized class variable @@cv in Test
    from (irb):9:in `cv'
    from (irb):16

Initialize the class variable with some data. And add values to the instance variable of a and b.

a.cv=45
 => 45 

a.cv
 => 45 
b = Test.new
 => # 
b.cv
 => 45 
a.cb = 34
 => 34 
a.cb
 => 34 
b.cb
 => nil 
b.cb = 90
 => 90 
b.cb
 => 90 

Rails way of creating a new full url with new parameters after removing old parameters from a url

If we have some keys and values and we just need to create a url with this data just pass the url and hash as a parameter to the following method.

def generate_url_with_params(url, params = {})
    uri = URI(url)
    uri.query = params.to_query
    uri.to_s
end

If you want to get rid of the parameters from a url use the following method.

  def generate_url_without_params(url, params = {})
    uri = URI(url)
    full_params = Rack::Utils.parse_query uri.query
    params.each do |key, val|
      full_params.delete key
    end
    uri.query = full_params.to_param
    uri.to_s
  end

How to implement a simple captcha in Rails using gem ‘simple_captcha’

Here it is, a simple captcha for Rails applications.

To set up, add the following line to your Gemfile

gem "galetahub-simple_captcha", :require => "simple_captcha"

Run rails generator

rails generate simple_captcha

Do db Migration

rake db:migrate -t

In your view file add

%= show_simple_captcha %

Add the following in yml file
en.yml:

en:
  simple_captcha:
    label: "Enter the above code"
    placeholder: "Enter here"

In controller just include captcha helpers module

class ApplicationController < ActionController::Base
  include SimpleCaptcha::ControllerHelpers
end

Use this code in the controller for the captcha validation

if simple_captcha_valid?
  do this
else
  do that
end

Details about paperclip error: ‘Paperclip::AdapterRegistry::NoHandlerError’ when you use paperclip gem in Rails

When I was working with rails and paperclip I got this error.

Paperclip::AdapterRegistry::NoHandlerError
 = form_tag my_path, :method => :post do
  -------
  = file_field_tag "attachment" 
  -----
 

I submitted a form and it was not saving. There I found that the form sending a file too. I missed

:multipart => true 

option in the ‘form_tag’ when submitting the form. The form really not sening a file and paperclip not getting an attachment. So it throws this error.

 = form_tag my_path, :method => :post, :multipart => true do
  -------
  = file_field_tag "attachment" 
  -----

Details about Rails paperclip error: ‘There was an error processing the thumbnail for paperclip-reprocess’

I got this error while working with paperclip. The project was stable and I have no idea why this error happens at this point of time.

[paperclip] An error was received while processing: #
[paperclip] An error was received while processing: #<Paperclip::PaperclipError: There was an error processing the thumbnail for paperclip-reprocess20110822-2281-19969sz

So I was lazy to fix the error, and find that I have no imagemagick installed in my new system. After installing ‘imagemagick’ it got fixed.

$ sudo apt-get update
$ sudo apt-get install imagemagick --fix-missing

Install Rails 3.2 with Ruby 1.9.3 using rvm in Ubuntu 14.0.1

Check ruby is already installed in your system or not

$ ruby -v 

Install curl if not installed

$ sudo apt-get install curl

Check curl version by

$ curl --version

Install RVM

Execute the command in the terminal

$ curl -L https://get.rvm.io | bash -s stable

If the installation is done, close the terminal window and open it again to load the rvm into the shell

Check rvm version

$ rvm -v

rvm 1.25.30 (stable) by Wayne E. Seguin , Michal Papis  [https://rvm.io/]

List rvm known rubies

$ rvm list known

Use rvm to install ruby 1.9.3

$ rvm install 1.9.3

Check the ruby versions available

$ rvm list rubies

Check the ruby version by

$ ruby -v

If this again shows the message to install ruby, then set this ruby version as default

$ rvm use ruby-1.9.3-p547 --default

then check ruby -v

Make gem package up to date

$ gem update

Install Rails 3.2.19

$ gem install rails --version '3.2.19'

Check rails version

$ rails -v 

You are ready to go!

ThinkingSphinx::SphinxError (undefined method `next_result’ for Mysql2 (rails 3)

I got this error after my thinking sphinx updation to the newest version of ‘3.0.5’. The error shows in the exact line of the code Model.search in my Rails controller. I updated my mysql2 version to ‘0.3.13’, and the issue is solved.
So in you Gemfile update the mysql2 version:

gem 'mysql2', '0.3.13'

And do

$ bundle install

Install Rails 4.0 with Ruby 2.0

Get the stable version of rvm:

$ rvm get stable

Install Ruby 2.0

$ rvm install ruby-2.0.0

Create a Gemset;

$ rvm gemset create rails-4.0

Goto that gemset:

$ rvm use ruby-2.0.0-p247@rails-4.0

Install Rails 4.0

$ gem install rails --version=4.0

Create an rvmrc file in root folder:

$ vim rvmrc
$ rvm --rvmrc use ruby-2.0.0-p247@rails-4.0

uncomment the line gem ‘therubyracer’, platforms: :ruby from Gemfile

Start the server:

$ rails s

You are ready to go!!

Changes that you may need to perform while working with Rails 4 compared to old versions:

1. Check here for the New changes in Rails 4
http://net.tutsplus.com/tutorials/ruby/digging-into-rails-4/
http://www.alfajango.com/blog/rails-4-whats-new/
http://www.sitepoint.com/get-your-app-ready-for-rails-4/
2. If you are using devise gem use devise version 3 or above (http://blog.plataformatec.com.br/2013/05/devise-and-rails-4/)