2016-01-27 38 views
0

我有一個對所有控制器都通用的基本URL。我想在一個地方聲明這個變量,並將其用於所有控制器中。這將使任何未來的更新快速簡單。那可能嗎?我在我的所有控制器中聲明如下:爲Rails中的所有控制器創建一個全局變量

@baseURL = "www.url.com/something/" 
+1

爲什麼不使用'root_url'和相關的('link_to'和'url_for')? – depquid

回答

4

利用ruby的繼承鏈。您可以定義一些父類所有的控制器爲一個常數,通常ApplicationController的:

class ApplicationController < ActionController::Base 
    BASE_URL = "www.url.com/something/" 
end 

然後,它會成爲提供給所有兒童是,即PostsController < ApplicationController

2

在您的應用程序控制器中。

before_action :set_variables 

def set_variables 
@baseURL = "www.url.com/something/" 
end 

,你讓所有的控制器繼承的ApplicationController這@baseURL實例變量將在所有的動作和視圖訪問。

0

Rails控制器繼承自ApplicationController。嘗試把它那裏:

def baseUrl 
@baseURL = "www.url.com/something/" 
end 
0

你可以在你的應用程序控制器定義一個類變量:

class ApplicationController < ActionController::Base 
    @@baseURL = "www.url.com/something/" 

    def self.baseURL 
    @@baseURL 
    end 
end 

class SomeFrontendController < ApplicationController 

end 

在所有的控制器,現在你可以訪問@@或基本URL調用類方法:

SomeFrontendController.baseURL 
# => "www.url.com/something/" 

但是這很髒。 更好使用常量:

class ApplicationController < ActionController::Base 
    BASE_URL = "www.url.com/something/" 
end 

class SomeFrontendController < ApplicationController 

end 

在所有的控制器,現在你可以訪問BASE_URL或者:如果是隻有一個變量

SomeFrontendController::BASE_URL 
0

,你肯定,你需要它只是在控制器範圍內聲明一個常量在ApplicationController應該足夠了:

class ApplicationController < ActionController::Base 
    BASE_URL = "www.url.com/something/" 
end 

class SomeOtherController < ApplicationController 
    def index 
    @base_url = BASE_URL 
    end 
end 

提前或推後,需要在應用程序中,因此它是非常有用的其他部位但是通常定義網址(和其他東西如電子郵件地址)使用的寶石一樣https://github.com/settingslogic/settingslogic有真理的唯一來源,並存儲在一個地方所有這些變量(文件)。

0

您可以在ApplicationController中定義一個方法,並使用像helper_method這樣的方法從視圖中訪問它。

class ApplicationController < ActionController::Base 

    helper_method :base_url 
    def base_url 
    @base_url ||= "www.url.com/something/" 
    end 
end 

我嘗試避免before_actions設置變量。 你的控制器和視圖裏面你將能夠調用base_url方法。

這是相同的,包括在application_helper.rb此方法。