2016-11-04 63 views
0

我使用紅寶石2.3.1和軌道3.2.1。我需要在應用程序控制器中初始化一個名爲has_sub_menu = false的變量。如何跨各種控制器使用相同的變量 - 軌道上的紅寶石

在我的應用程序中,我使用了30多個控制器,並且只有兩個控制器包含子菜單,所以我需要將has_sub_menu = true分配給這些控制器以在佈局文件中進行驗證。

這是我application.rb

has_sub_menu = false 

some_controller01.rb

has_sub_menu = true 

some_controller02.rb

has_sub_menu = true 

我試着像這樣layout.rb

if controller.has_sub_menu == true 
    show_menu_items 
end 

show_menu_items將在兩個控制器是可用的,目前我不能夠訪問佈局文件的has_sub_menu

我知道在C#中,我可以變量聲明爲靜態和使用對象訪問它的任何文件。

就像明智的我怎麼能聲明application控制器中的變量,並在另外兩個控制器中爲該變量分配不同的值,並且我需要在layout.rb文件中訪問該值以進行子菜單驗證。

+0

不應該是走在application_controller的方法,而不是application.rb中? –

回答

1

添加一個實例方法application_controller.rb和任何控制器覆蓋它,應該有不同的價值:

class ApplicationController < ActionController::Base 
    def has_sub_menu # unless overriden in descending controller, value will be true 
    true 
    end 
end 

class OtherController < ApplicationController 
    def has_sub_menu 
    false 
    end 
end 

這種方式,您可以訪問所有控制器has_sub_menu「方法」。

1

相反,你可以創建一個輔助方法,檢查控制器的名稱

module ApplicationHelper 
    CONTROLLERS_LIST = ['UsersController'] 

    def has_sub_menu 
    CONTROLLERS_LIST.exclude?(params[:controller]) 
    end 
end 
+0

對於那些第一次看到控制器代碼的人來說並不那麼簡單明瞭,但確實是一個不錯的選擇! –

+0

他說他需要在'layout'中檢查它,所以最好在輔助方法中添加這個邏輯 –

+0

我正在尋找一個解決方案來驗證它而不是controller_name。 – user2681579