我从rails 2升级到rails3,在我的控制器代码中就像这样
class UserController < ApplicationController
layout :choose_layout
def choose_layout
return 'login' if action_name == 'login' or action_name == 'set_new_password'
return 'forgotpw' if action_name == 'forgot_password'
return 'dashboard' if action_name == 'dashboard'
'application'
end
def all
@users = User.active.all
end
end
上面的布局方法在rails2上运行正常,但不是在rails3中调用。我不知道为什么会这样,如果我在行动中写这样的代码
class UserController < ApplicationController
def all
@users = User.active.all
render :layout => choose_layout
end
def choose_layout
layout_name ="application"
layout_name = 'login' if action_name == 'login' or action_name == 'set_new_password'
layout_name = 'forgotpw' if action_name == 'forgot_password'
layout_name = 'dashboard' if action_name == 'dashboard'
layout_name
end
end
然后布局完美呈现。
任何人都可以帮我解决这个问题
答案 0 :(得分:0)
class UserController < ApplicationController
layout :choose_layout
def choose_layout
case action_name
when 'login', 'set_new_password'
'login'
when 'forgot_password'
'forgotpw'
when 'dashboard'
'dashcboard'
else
'application'
end
end
end
class UserController < ApplicationController
layout "application"
layout "login", only: [:login, :set_new_password]
layout "forgotpw", only: [:forgot_password]
layout "dashboard", only: [:dashboard]
end
答案 1 :(得分:0)
我不知道为什么会发生这种情况,但是当我调试控制器自身对象并检查是否有任何类似的布局名称时
self.action_has_layout?
然后它会生成我nil
所以我在应用程序控制器上添加一个前过滤器并检查布局是否为nil然后我使用self.action_has_layout =
方法设置布局。
它对我来说很好。
例如我的代码现在是这样的
before_filter :set_default_layout
def set_default_layout
unless self.action_has_layout?
self.action_has_layout = "application"
end
end