【问题标题】:How to access ApplicationHelper methods in namespaced views?如何在命名空间视图中访问 ApplicationHelper 方法?
【发布时间】:2021-07-13 12:43:11
【问题描述】:

我在 app/helpers/application_helper.rb 中有一个模块 ApplicationHelper 像这样定义的

module ApplicationHelper
  def some_method(arg)
    
  end
end

我的视图文件在这里

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

所以我正在尝试访问

some_method()

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

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

【问题讨论】:

  • “它没有反映”是什么意思?您是否在日志中收到方法未找到或其他错误?
  • 请使用 v1/admin/messages 控制器进行更新。它是否继承自 ApplicationController?
  • @rmlockerd 是的,我正在尝试在视图中访问它

标签: ruby-on-rails ruby-on-rails-6 ruby-on-rails-5.2 ruby-on-rails-6.1 zeitwerk


【解决方案1】:

您没有包含您的控制器代码,但我们假设它最终继承自 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

【讨论】:

  • 非常感谢它对我有用的答案!
猜你喜欢
  • 2012-02-17
  • 1970-01-01
  • 2018-09-16
  • 2013-05-17
  • 2018-06-26
  • 2018-02-03
  • 1970-01-01
  • 2012-09-04
  • 2012-03-14
相关资源
最近更新 更多