0

我在 app/helpers/application_helper.rb 中有一个模块 ApplicationHelper 定义如下

module ApplicationHelper
  def some_method(arg)
    
  end
end

我有我的视图文件在这里

app/views/v1/admin/messages/show.json.jbuilder

所以我正在尝试访问

一些方法()

在视图文件中,但它没有反映!这是由于命名空间吗?或者我无法理解的。如果有人解释这个概念,那就太好了。提前致谢!

它说未定义的方法错误可能是什么原因?

4

1 回答 1

1

您没有包含您的控制器代码,但我们假设它最终继承自ActionController::API(如果它是 API 控制器则应该如此)。如果是这样,那是它的根源,而不是命名空间等。根据 ActionController 文档:

API 控制器与普通控制器的不同之处在于,默认情况下它不包含浏览器访问通常需要的许多功能:布局和模板渲染、flash、资产等。这使得整个控制器堆栈更薄,适用于 API 应用程序。这并不意味着如果你需要它们就没有这些特性:它们都可供你包含在你的应用程序中,它们只是不是默认 API 控制器堆栈的一部分。

更薄的 API 控制器的副作用之一是它们不会像标准 Rails 控制器那样自动包含帮助程序。不过,您可以轻松地将其重新添加。

消息控制器.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

应用程序/视图/消息/show.json.jbuilder

json.bogus do
  thing1: some_method('banana')
end

如果你有很多 API 控制器,你当然可以把它放在一个它们都继承自的基本控制器类中,如下所示:

class Api::V1::ApiController < ActionController::API
  include ActionController::Helpers
  helper ApplicationHelper
end
于 2021-07-14T05:21:51.617 回答