Reputation: 111
I'm new to rails and have a question regarding layouts and routing in a CMS. I haven't come across an answer on this particular issue after searching the web so I hope someone here could help me.
I'm building a CMS and have to layouts, application.html.erb (default) which is the front public page and admin.html.erb which is available after logging in.
I have resource called Post. Is it possible that only the show view uses the default layout while the rest of the views uses the admin layout?
In other words I want urls to single posts to be like "myAppDomain/posts/1" and use the default layout
while administrative views should have /admin as a prefix and use the admin layout,
like "myAppDomain/admin/posts", "myAppDomain/admin/posts/1/edit"
Now I've set up a route that "adds" the /admin to the posts urls
scope "/admin" do
resources :posts
end
And in the PostsController I specify to use the admin layout
class PostsController < ApplicationController
before_filter :authorize , :except => [:show]
layout 'admin'
...
So now people can read posts without logging in, but the links to the single post view on my welcome page is rendered "myAppDomain/admin/posts/1" and it uses the admin layout
<%= link_to post.title, post %>
Is there a way to use different layouts and routes on single views for a resource or should I go for a different approach?
Upvotes: 7
Views: 3892
Reputation: 53017
I arrived here looking for how to have no layout at all. In case anyone else is after that, use render layout: false
:
class YourController < ApplicationController
def your_action
# your code here
render layout: false
end
end
Upvotes: 0
Reputation: 5449
You can do a before_action
private
def layout_set
if current_user.admin?
layout 'admin'
else
layout 'default'
end
end
At the top of the controller:
before_action :layout_set
Now you can forget about adding the layout. You can take it a step further and put the before action in your application controller and you can add that functionality in all your controllers by just adding the same before_action. You save a lot of extra code this way.
Upvotes: 1
Reputation: 3069
Just specify the layout in the action
def show
render :layout => 'application'
end
Upvotes: 5