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)

Need to find a lawyer for your business? Get in touch with my company Lexoo and we'll find you a great one for free.