问题描述
我在 app/helpers/application_helper.rb 中有一个模块 ApplicationHelper 像这样定义
module ApplicationHelper
def some_method(arg)
end
end
app/views/v1/admin/messages/show.json.jbuilder
所以我想访问
some_method()
在视图文件中但它没有反映! 这是由于命名空间吗?或者我无法理解的内容。 如果有人解释这个概念,那就太好了。 提前致谢!
解决方法
您没有包含控制器代码,但我们会假设它最终继承自 ActionController::API
(如果它是 API 控制器就应该如此)。如果是这样,那就是它的根,而不是命名空间等。根据 ActionController 文档:
API 控制器在某种意义上不同于普通控制器 默认情况下,它不包含许多功能 通常仅浏览器访问需要:布局和模板 渲染、Flash、资产等。这使得整个控制器 堆栈更薄,适用于 API 应用程序。这并不意味着你 如果您需要它们,则不会有这些功能:它们都可用于 您要包含在您的应用程序中,它们只是不属于 默认 API 控制器堆栈。
更薄的 API 控制器的副作用之一是它们不会像标准 Rails 控制器那样自动包含帮助程序。不过,您可以轻松地将其重新添加回来。
messages_controller.rb
class Api::V1::MessagesController < ActionController::API
include ActionController::Helpers
helper ApplicationHelper
def show
# whatever
end
end
app/helpers/application_helper.rb
module MessagesHelper
def some_method(arg)
# whatever
end
end
app/views/messages/show.json.jbuilder
json.bogus do
thing1: some_method('banana')
end
如果您有很多 API 控制器,您当然可以将它们粘贴在它们都继承自的基本控制器类中:
class Api::V1::ApiController < ActionController::API
include ActionController::Helpers
helper ApplicationHelper
end