资源的单个视图上的不同布局和路由

时间:2011-02-20 11:09:12

标签: ruby-on-rails

我是rails的新手,对CMS中的布局和路由有疑问。我在搜索网页后没有遇到过这个问题的答案,所以我希望有人可以帮助我。

我正在构建CMS并且必须布局 application.html.erb (默认),这是前面的公共页面,而 admin.html.erb 是登录后可用。

我有一个名为 Post 的资源。是否有可能只有show视图使用默认布局,而其余视图使用管理布局?

换句话说,我希望网址单个帖子像“myAppDomain / posts / 1”并使用默认布局
管理视图应该有 / admin 作为前缀并使用管理布局,
比如“myAppDomain / admin / posts”,“myAppDomain / admin / posts / 1 / edit”

现在我已经设置了一条路线,将“添加”/ admin添加到帖子网址

scope "/admin" do
   resources :posts
end

在PostsController中我指定使用管理布局

class PostsController < ApplicationController
   before_filter :authorize , :except => [:show]
   layout 'admin'
   ...

所以现在人们可以在不登录的情况下阅读帖子,但是我欢迎页面上单个帖子视图的链接呈现为“myAppDomain / admin / posts / 1”,并且它使用了管理布局

<%= link_to post.title, post %>

有没有办法在资源的单个视图上使用不同的布局和路由,还是应该采用不同的方法?

2 个答案:

答案 0 :(得分:5)

只需在动作中指定布局

即可
def show
    render :layout => 'application'    
end

答案 1 :(得分:1)

你可以做一个before_action

private

def layout_set
  if current_user.admin?
    layout 'admin'
  else
    layout 'default'
  end
end

在控制器的顶部:

before_action :layout_set

现在你可以忘记添加布局了。您可以更进一步,将之前的操作放在应用程序控制器中,只需添加相同的before_action即可在所有控制器中添加该功能。以这种方式节省了大量额外代码。