我正在尝试将一个网站分成两个部分。一个应该使用应用程序布局,另一个应该使用管理布局。在application.rb中,我创建了一个函数,如下所示:
def admin_layout
if current_user.is_able_to('siteadmin')
render :layout => 'admin'
else
render :layout => 'application'
end
end
在控制器中,可能是其中之一,我将
before_filter :admin_layout
这对于某些页面(只是文本)很有效,但对于其他页面,我会得到经典的错误:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
有人知道我错过了什么吗?如何正确使用render和layout?
发布于 2009-07-14 21:22:45
render
方法实际上将尝试呈现内容;当您想要做的只是设置布局时,您不应该调用它。
Rails为这一切提供了一种模式。只需将一个符号传递给layout
,就会调用具有该名称的方法来确定当前布局:
class MyController < ApplicationController
layout :admin_layout
private
def admin_layout
# Check if logged in, because current_user could be nil.
if logged_in? and current_user.is_able_to('siteadmin')
"admin"
else
"application"
end
end
end
发布于 2009-07-14 21:19:05
也许您需要先检查用户是否已登录?
def admin_layout
if current_user and current_user.is_able_to 'siteadmin'
render :layout => 'admin'
else
render :layout => 'application'
end
end
发布于 2009-07-14 21:25:18
这可能是因为当用户未登录时,current_user
为nil
。测试.nil?
或初始化对象。
https://stackoverflow.com/questions/1128080
复制相似问题