ruby 为Rails中的所有控制器创建全局变量

tnkciper  于 2022-12-29  发布在  Ruby
关注(0)|答案(6)|浏览(340)

我有一个所有控制器共用的基本URL。我想在一个地方将其声明为变量,并在所有控制器中使用它。这将使将来的任何更新快速而简单。这可能吗?我在所有控制器中声明它,如下所示:

@baseURL = "www.url.com/something/"
djmepvbi

djmepvbi1#

在应用程序控制器中。

before_action :set_variables

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

当您使所有控制器继承ApplicationController时,此@baseURL示例变量将可在所有操作和视图中访问。

rkkpypqq

rkkpypqq2#

通常情况下,所有控制器都继承自ApplicationController,然后可以在那里定义变量,使其可供后代使用。

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

bxjv4tth3#

您可以在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中包含此方法也是一样的。

t2a7ltrp

t2a7ltrp4#

Rails控制器继承自ApplicationController。请尝试将其放在此处:

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

6mw9ycah5#

您可以在应用程序控制器中定义类变量:

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

  def self.baseURL
    @@baseURL
  end
end

class SomeFrontendController < ApplicationController

end

现在,在所有控制器中,您都可以访问@@baseURL或调用类方法:

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
nszi6y05

nszi6y056#

如果它只有一个变量,并且您确信,那么您只需要在控制器作用域内使用它,在ApplicationController中声明一个常量就足够了:

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

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

然而,通常在应用程序的其他部分迟早需要自定义URL(和其他东西,如电子邮件地址),因此通过使用https://github.com/settingslogic/settingslogic之类的gem并将所有此类变量存储在一个位置(文件)来获得单个真实源是有用的。

相关问题