Ruby on Rails: Grabbing the model object using the controller name

I found myself in a situation where I was creating basically the same method in many of my controllers, the only difference being the name of the model object. For example:

class ArticlesController
  # .... cut 
  def set_recommended(is_recommended)
    @article.recommended = is_recommended
    @article.save    
    respond_to do |format|
      format.js { render :nothing => true }
    end    
  end

class MoviesController

.... cut

def set_recommended(is_recommended)
@movie.recommended = is_recommended
@movie.save
respond_to do |format|
format.js { render :nothing => true }
end
end
end

So, I want to refactor this code, and create one method for this in the application.rb file – but how to refer to the @movie and @article objects?

Simply by using the instance_variable_get method! You simply pass in a string with the name of the method, and it returns the instance variable.

Here’s how the new method looked within the application.rb file.
class ApplicationController
  # .... cut 
  def set_recommended(is_recommended)
    object = instance_variable_get(
      "@#{self.controller_class_name.chomp("Controller").
        singularize.underscore}")
    object.recommended = is_recommended
    object.save    
    respond_to do |format|
      format.js { render :nothing => true }
    end        
  end
end

Of course, this only works for controllers and model names that follow the singular, plural convention (i.e. model name is article and controller name is ArticlesController)