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
Related
I have some common HTML for most of the views (like headers and footers), so I put them in application.html.erb file.
Now, I have few pages whose HTML has nothing in common with others, so instead of changing application.html.erb and impacting all the pages, I want a way to load these few pages completely from the view file without involving application.html.erb.
Add render layout: false at the end of your action or if you want to use it for every action in the controller, add layout false at the beginning of the controller.
You have to declare layout false un the controller action like:
def action_name
...
render layout: false
...
end
You can check render option in http://guides.rubyonrails.org/layouts_and_rendering.html#options-for-render
There are many ways to render no layout or other layout.
By default is application.html.erb layout.
-In below code, no layout is called to any actions. Or specified layout is called to all actions.
class UserController < ApplicationController
layout :false
def action
..
end
end
-In below code, only specific action layout is called and for other actions default layout is called.
class UserController < ApplicationController
def action
..
render layout :false
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 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
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"