在 Rails 中创建帮助程序时未定义的方法

Posted

技术标签:

【中文标题】在 Rails 中创建帮助程序时未定义的方法【英文标题】:Undefined method when creating a helper in Rails 【发布时间】:2013-07-20 04:12:25 【问题描述】:

我尝试创建一个帮助模块来设置页面的标题。当然它不起作用 (reference) 我必须在控制器中定义什么东西才能让我的控制器看到我的助手方法吗??

Gitlink:works_controller.rb

  def index
    set_title("Morning Harwood")
    @works = Work.all

    respond_to do |format|
      format.html # index.html.erb
      format.json  render json: @works
    end
  end

在application_helper.rb:

module ApplicationHelper
    def set_title(title = "Default title")
      content_for :title, title
    end  
end

在布局work.html.erb:

 <%= content_for?(:title) ? content_for(:title) : 'This is a default title' %>

【问题讨论】:

您添加了三个完全断开的代码。你想达到什么目标? 你就不能这样做&lt;title&gt;&lt;%= @page_title || 'default_title' %&gt;&lt;title&gt; 【参考方案1】:

Rails 中的帮助器是视图中可用的方法(以及控制器,如果您包含它们),它们允许您避免视图中的代码重复。

我的代码中的帮助器示例是一种为 facebook 登录按钮呈现 html 的方法。这个按钮实际上比用户看到的要多,因为它是一个带有一些附加信息等的隐藏表单。出于这个原因,我想用它制作一个辅助方法,所以我可以调用一个而不是多次复制 10 行代码单一方法。这更干燥。

现在,回到你的例子,你想做两件事

显示页面&lt;title&gt;, 在页面顶部添加&lt;h1&gt; 标题。

我现在看到链接的答案不够清楚。你确实需要助手,但你也需要调用它!所以

# application_helper.rb
def set_title(title = "Default title")
  content_for :title, title
end

# some_controller.rb
helper :application

def index
  set_title("Morning Harwood")
end

然后在布局的视图中你可以使用:

<title> <%= content_for?(:title) ? content_for(:title) : 'This is a default title' %><</title>
...
<h1><%= content_for?(:title) ? content_for(:title) : 'This is a default title' %></h1>

【讨论】:

我怎样才能把它变成一个辅助类? 但是你为什么坚持要有帮手,你明白帮手是干什么用的吗? 助手不是类,它们是模块。 抱歉,我对导轨及其正确的命名法缺乏了解。我想创建一个标题助手,因为上面引用的链接表明这样做是最佳实践。我觉得这是理解 helper MODULES 的一个很好的起点。我觉得了解如何创建助手将有助于我的下一个任务;也就是说,创建一个助手,允许我将当前类从当前路由添加到锚标记。 ***.com/questions/3705898/… @MatthewHarwood 查看我更深入的解释。

以上是关于在 Rails 中创建帮助程序时未定义的方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中使用 RSpec 和 Capybara 时未定义的方法“访问”

尝试使用外部库时未定义的引用

尝试使用 useContext() 获取对象时未定义对象

通过 Webpack 在 Rails 中安装 jQuery 时未定义 $

在 after_save_filter 中生成 CSV 时未定义的方法“column_names”

在 Codeigniter 中调用扩展辅助函数时未定义的函数