如何在命名空间视图中访问 ApplicationHelper 方法?

问题描述

我在 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...