Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

will initialize break the layout settings in rails?

In one of the controller, I need a specific layout. I added layout at the beginning. It works well.

But if I add an initialize function for some controller-based variable. Rails seems just ignore the layout command.

Is anyone have same problem? How can I fix it?

class AdminsController < ApplicationController

  layout "layout_admins"

  def initialize
    @Title = "Admins"
  end

  def index
    ....... some code here
  end
end
like image 446
Victor Lam Avatar asked Oct 13 '10 04:10

Victor Lam


People also ask

What is initializer in Rails?

An initializer is any file of ruby code stored under /config/initializers in your application. You can use initializers to hold configuration settings that should be made after all of the frameworks and plugins are loaded.

What is initialize method in Ruby?

The initialize method is part of the object-creation process in Ruby and it allows us to set the initial values for an object. Below are some points about Initialize : We can define default argument. It will always return a new object so return keyword is not used inside initialize method.


2 Answers

initialize is used internally to Rails to, well, initialize a new instance of your controller so it can then serve requests on it. By defining this method in this particular manner, you are breaking Rails.

There is a way through! A light at the end of the tunnel. A pot of gold at the end of the rainbow:

def initialize
  @title = "Admins"
  super
end

See that little super call there? That'll call the superclass's initialize method, doing exactly what Rails would do otherwise. Now that we've covered how to do it your way, let's cover how to do it the "officially sanctioned" Rails way:

class AdminsController < ApplicationController
  before_filter :set_title


  # your actions go here

  private      
    def set_title
      @title = "Title"
    end
end

Yes, it's a little more code but it'll result in less frustration by others who gaze upon your code. This is the conventional way of doing it and I strongly encourage following conventions rather than doing "magic".

EDIT: If you're using Rails 5 then you'll need to use before_action instead of before_filter.

like image 84
Ryan Bigg Avatar answered Oct 29 '22 20:10

Ryan Bigg


I'm not sure exactly how layout works its magic, but I'm willing to bet it's in a yield block in the ActionController#initialize method. So your overriding of initialize would explain the problem.

Looks like you have too options here:

  1. Close out your new definition with super to call the ActionController initialize which should use the layout defined in the class.

    eg:

    def initialize
      @Title = "Admins"
      super
    end
    
  2. Use a before filter to initialize your variables. This is the Rails Way of initializing values in a controller

    class AdminsController < ApplicationController
      layout "layout_admins"
    
    
      before_filter :set_title
      def set_title
        @Title = "Admins"
      end
    
    
      def index
        ....... some code here
      end
    end
    
like image 30
EmFi Avatar answered Oct 29 '22 21:10

EmFi