我的所有控制器都有一个通用的基本URL。我想在一个地方将它声明为一个变量,并在我的所有控制器中使用它。这将使任何未来的更新变得快速而简单。那可能吗?我在我的所有控制器中都这样声明:
@baseURL = "www.url.com/something/"
答案 0 :(得分:4)
利用ruby的继承链。您可以将所有控制器的某个父类定义为常量,通常为ApplicationController
:
class ApplicationController < ActionController::Base
BASE_URL = "www.url.com/something/"
end
然后它将对所有孩子都可用,即PostsController < ApplicationController
。
答案 1 :(得分:4)
在您的应用程序控制器中。
before_action :set_variables
def set_variables
@baseURL = "www.url.com/something/"
end
当您使所有控制器继承ApplicationController时,可以在所有操作和视图中访问此@baseURL
实例变量。
答案 2 :(得分:1)
您可以在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
。
答案 3 :(得分:0)
Rails控制器继承自ApplicationController。试着把它放在那里:
def baseUrl
@baseURL = "www.url.com/something/"
end
答案 4 :(得分:0)
您可以在应用程序控制器中定义一个类变量:
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
答案 5 :(得分:0)
如果它只是一个变量并且您确定,那么仅在控制器范围内需要它,在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来存储所有这些内容,这对于获得单一的事实来源非常有用。变量在一个地方(文件)。