2014-11-01 60 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