2014-11-01 59 views
0

我是从梁2升级到Rails3中,并在我的控制器代码是这样的布局方法不叫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

你设置为'ApplicationController'布局?如果是这样,请尝试设置它来测试是否导致问题? – Nimir 2014-11-01 08:50:42

+0

嗨感谢您的帮助,它不工作,我在应用程序控制器上写它 – 2014-11-01 09:04:28

+0

我的意思是检查你的'application_controller'代码,它是否有一个默认布局'layout:somthing'?检查http://apidock.com/rails/ActionController/Layout/ClassMethods/layout最后的评论在这种情况下提到了冲突! – Nimir 2014-11-01 14:38:43

回答

0

我不知道它为什么会发生,但是当我调试控制器自己的对象和检查有任何这样的布局名称

self.action_has_layout? 

然后它会产生我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 
0

方法#1

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 

方法2

class UserController < ApplicationController 
    layout "application" 
    layout "login", only: [:login, :set_new_password] 
    layout "forgotpw", only: [:forgot_password] 
    layout "dashboard", only: [:dashboard] 
end 
+0

我得到这个错误 '未定义的方法'布局”为#' – 2014-11-01 10:41:57

+0

我已经在轨道3上进行测试,他们实际上工作。如果你打算使用方法#2 – mohameddiaa27 2014-11-01 11:13:18

+0

,那么只要在'top layout'应用程序顶部保留''我也在应用程序控制器中执行此操作'include AbstractController :: Layouts :: ClassMethods'是否有任何我缺少的内容 我正在使用rails 3.2.14和ruby ruby​​-1.9.3-p547 – 2014-11-01 11:27:42