I have an application where my homepage is significantly different from other pages. SO can you suggest how I should use my layout?
You can change the layout for all actions in a controller with the following code:
class ThingsController < ApplicationController
layout "my_layout"
...
end
You can change the layout for a specific action using the following code:
def ThingsController < ApplicationController
def action
...
# to render "app/views/things/action"
render :layout => "my_layout"
# or to render a specific view
render "pages/something", :layout => "my_layout"
end
end
If I got it right you are asking about how to manage multiple layouts for your project. What you could do is simply adding your layouts inside the layout directory and by referencing the one you want to use by adding this line to the controller:
layout "name_of_your_layout"
Related
i know application.html.erb is the default for every page .i want to use a different layout when user login .i mean the dashboard after login should be of different layout rather than the default one(application.html.erb).
Create new layout eg app/views/layouts/dunno.html.erb. Use in controller
class DashboardController < ApplicationController
layout 'dunno'
end
or per action
class DashboardController < ApplicationController
def index
render layout: 'dunno'
end
end
see docs for details
You can do this in application controller, add this code, I am assuming that you are using devise
layout :layout_by_resource
def layout_by_resource
user_signed_in? ? "my_custom_layout" : "application"
end
In your application_controller.rb file do this, hope it helps.
layout :set_layout
def set_layout
if current_user
'dashboard_layout'
else
'default_layout'
end
end
Details about layouts can be found here.
Using a different layout in the action render call
If most of your actions use the same layout, it makes perfect sense to
define a controller-wide layout as described above. Sometimes you'll
have exceptions where one action wants to use a different layout than
the rest of the controller. You can do this by passing a :layout
option to the render call. For example:
class WeblogController < ActionController::Base
layout "weblog_standard"
def help
render action: "help", layout: "help"
end
end
This will override the controller-wide “weblog_standard” layout, and will render the help
action with the “help” layout instead.
If you are using devise gem, and your goal is to use another layout within devise controllers, have a look at their docs
i wanted two different layouts before signin and after signin,so i have implemented using below code where application_controller changes the layout if user is signed_in else uses different layout....
if you are using devise ,dont forget to add layouts in views/layouts
in application_controller.rb
layout :layout_by_resource
def layout_by_resource
unless user_signed_in?
Rails.logger.info "===========Setting layout as views/layouts/auth.html.erb"
'auth'
else
Rails.logger.info "===========Setting layout as views/layouts/blue.html.erb"
'basic'
end
end
Most of my view files have the same layouts, hence it was reasonable to define layouts/application.html.haml (and other header, footer files).
But now I need to create a page that does NOT have any of those styling.
In fact, I just want a plain page with a header.
How do I do that?
I think you're after. In your controller, assuming your action is called myaction
def myaction
# do here whatever you need to do and then
render :layout => false
end
See options for render in Rails Guide: layouts and redendering
You can specify the layout in the controller like so:
class ThingsController < ApplicationController
layout "some_layout"
# rest of the controller
end
This would look for app/views/layouts/some_layout.html.erb
You can also use a method to choose the layout:
class ThingsController < ApplicationController
layout :choose_layout
def choose_layout
current_user.cat? ? "cat" : "dog"
end
# rest of the controller
end
I want a particular page in the application to have different layout, while all others will have pretty much the same layout. However, the application.html.erb file is rendered for all the pages in application. How do I not use the application.html.erb file for a particular page?
Rails version : 3.2.1
You can make another layout and specify and in your action you can simply use that as follow
class ReportsController < ApplicationController
before_filter :authenticate_affiliate_user!
def daily_breakdown
render :layout => 'admin_layout'
end
end
to you different layout in all of the action you can do as follow
class ReportsController < ApplicationController
layout 'reporting_affiliate'
before_filter :authenticate_affiliate_user!
# your code here
end
Hi you can use layout option or specify particular layout in action
Class SomeControlle < ...
layout :admin_layout,:only=>[:some_action]
def some_action
#or
render :layout=>'admin_layout'
end
end
Use render :layout => 'special_layout' in your controller where you render.
I know that by default, views in Rails use the template provided in application.html.erb. However, there's one view that I wouldn't like to use the template provided in application.html.erb, but rather write all the HTML in that view itself. Is that possible to do?
At the end of your controller action, add:
render :layout => false
For a specific action:
class SomeController < ApplicationController
def my_custom_action
render layout: false
end
end
You can achieve the same thing using custom layouts.
e.g. For WelcomeController
Create a custom layout file named welcome.html.erb in app/views/layout/.
Write your layout code there(don't forget the yield). Due to rails Convention over Configuration feature when rails renders any view mapped to WelcomeController, welcome.html.erb will override the default application.html.erb layout.
If you want to name your custom layout file differently. Rails allows you to do that as well. Name your layout file as mylayout.html.erb.
In WelcomeController, add the following code
class WelcomeController < ApplicationController
layout 'mylayout'
....
end
If you want custom layout for only a specific action, then on the last line of action write render layout: 'mylayout'
Sure, in your action do something like this:
def action
render :layout => false
end
This assumes there are other actions in your controller which do need the layout. Otherwise, I would specify layout false in the controller root.
If you have multiple actions which don't need a layout, I believe you can do
layout false, :only => [ :action1, :action2 ]
You have to be sure that your controller inherits from ApplicationController
class MyCustomController < ApplicationController
I want to all my views from different paths to use the 'layouts/application.html.erb', except a view that has a specific structure. Is that possible without forcing to create a layout for this view and each one for others?
The 'index.html.erb' couldn`t use the layout 'application.html.erb' in my case.
You can override the default layout by passing an explicit layout name in the render call.
class FoosController < ApplicationController
def index
# call below uses layouts\new_layout.html.erb as the layout
render :layout => 'new_layout'
# if you want to render without a layout
# render :layout => false
end
end
This is easy. If you want to use a different layout for the entire controller, just put the following at the top of that controller:
class ItemsController < ApplicationController
layout "inventory"
#...
end