Ruby on rails 3 使所有ActionViewer帮助程序方法在模块中可用

Ruby on rails 3 使所有ActionViewer帮助程序方法在模块中可用,ruby-on-rails-3,Ruby On Rails 3,我正在使用RubyonRails3。我有一个名为Content的模型。在控制器中,我提取一些变量并将它们传递给查看器。在查看器中,我希望使用我自己制作的函数,这样查看器中就不会有太多的逻辑和代码。我在ContentsHelper模块中定义了这些函数 ContentsHelper模块中定义的My函数正在使用ActionViewer帮助函数,但是这些函数在ContentsHelper模块中不可用。例如,我得到了#错误的NoMethodError:undefined方法内容_标记” 如何使所有Acti

我正在使用RubyonRails3。我有一个名为
Content
的模型。在控制器中,我提取一些变量并将它们传递给查看器。在查看器中,我希望使用我自己制作的函数,这样查看器中就不会有太多的逻辑和代码。我在
ContentsHelper
模块中定义了这些函数

ContentsHelper模块中定义的My函数正在使用ActionViewer帮助函数,但是这些函数在ContentsHelper模块中不可用。例如,我得到了#错误的
NoMethodError:undefined方法内容_标记”

如何使所有ActionViewer助手功能可用

新手

Tim的以下建议:

module ContentsHelper
include ActionView::Helpers
  def bla
    content_tag(:h2, self.title)        
end
我可以在控制台中以
Content.bla
的形式运行bla方法。这太完美了

但是当我用
image\u标签
替换c
content\u标签
时,我遇到了麻烦,出现了以下错误:

NoMethodError: undefined method `config'
from /Users/sonat/.rvm/gems/ruby-1.8.7-p334/gems/activemodel-3.0.0/lib/active_model/attribute_methods.rb:364:in `method_missing'
from /Users/sonat/.rvm/gems/ruby-1.8.7-p334/gems/activerecord-3.0.0/lib/active_record/attribute_methods.rb:46:in `method_missing'
from /Users/sonat/.rvm/gems/ruby-1.8.7-p334/gems/activerecord-3.0.0/lib/active_record/attribute_methods.rb:44:in `send'

我可以看到负责image_tag方法的模块缺少“某物”。如果你们能告诉我查找缺失内容的一般方法以及解决问题的方法,我将不胜感激。

看起来您正在尝试做一些奇怪的事情,比如在模型中使用helper方法,而不是在视图中使用。辅助对象方法用于视图,而不用于模型

补充 Tim问我是否可以提供一些到其他资源的链接,但实际上这是非常基本的东西,我不知道有什么可以处理。大多数教程都处理一些不寻常的事情,比如在视图外部使用帮助程序

因此,这里有一些代码:

app/helpers/contents\u helper.rb app/views/contents/index.html.erb
列出内容
转到/contents URL时的HTML输出
列出内容
福

这很难做到。

内容标签:

这行吗

module ContentsHelper
 include ActionView::Helpers
end

图像标签:

看起来您必须通过实现
#path_to_image(image)
方法让模型知道图像的位置

我已经为我们设定了一个要点,在这里模拟您需要的功能:

您应该能够下载并运行forNoNameNo.rb(应该安静地运行,不会出现错误)

该文件提供了一些使图像标签工作所需的示例


进一步讨论:

助手可能是Rails中最奇怪的部分。它们是在控制器级别声明的,但只包含在视图级别,并且依赖于控制器堆栈的奇怪部分来获取它们的信息;然而,他们主要关心的信息是模型信息。所以他们散布在所有这些奇怪的问题上

为了处理由此产生的代码组织问题,人们倾向于使用。(另见)

这就是说,如果您希望在rails中偏离常规,那么阅读源代码通常非常有用

如果您使用的是textmate:

    mate `gem which actionpack`../action_view

在Terminal.app中,您的应用程序应该可以到达那里。如果您使用的是另一个编辑器/操作系统,您可能必须导航到actionpack告诉您要去的地方。

我同意这个奇怪之处。我想我完全糊涂了。不过,据我所知,助手是为观众服务的。这也是我的意图。例如:我正在将
@content
变量传递给查看器
@content.body
包含一个长文本,出于演示目的,我想根据其他参数(例如,取决于内容)将其缩短。我不想在查看器中计算所有这些内容,因此我需要一个助手来进行所有这些计算并输出html代码。因此,我需要在助手中使用ActionViewer::Helper方法,但不知道如何使用?例如,假设这是我的助手:
模块ContentsHelper;def缩短;内容标签(somecode);结束;结束
。我的问题是让
content\u tag
在这里可用…@NoNameNo:这是他的意思,顺便说一下:@NoNameNo,你的错误消息在
content
-这是模型类。如果您在视图中使用视图帮助器,那么错误将出现在类似
#…的地方,只是为了澄清一下-只要您在视图中(即在.erb或.haml文件中)而不是在模型中使用帮助器,您就不需要在帮助器中使用ActionView方法。所有ActionView方法都可用。您的“自制函数”在做什么?查看您正在描述的代码会很有帮助。Rails紧贴一组配置模式。我建议在一开始就坚持这些模式,因为它们已经被证明了。一段时间后,您可以对模式本身进行更改,甚至对模式本身做出贡献。看起来您可能需要确保:controller module level变量可用:您的编辑正在谈论运行
Content。控制台中的bla
是相关的。控制台不加载视图上下文,它实际上只用于运行模型方法。有太多的上下文缺失(比如整个
请求
上下文),这意味着许多东西(比如路径帮助器)在控制台中无法工作,除非进行大量的黑客攻击(这使得大多数使用控制台测试非模型方法的努力无效)。(cc@natedavisolds)如果我们能看到您试图在助手中使用哪些TagHelpers方法,这将非常有帮助,这样我们就可以建议您是否最好将其拆分为半视图、半模型样式,或者在模型级别生成字符串是否真的是一种好方法。Tim请查看新的编辑。你的建议在一定程度上帮助了我。你让它听起来比实际情况复杂得多。如果你按照他们的意图使用帮助者,他们并不奇怪。您不需要任何特殊的
包含
,当然也不需要阅读任何源代码
<h1>Listing Contents</h1>

<p>Foo</p>
module ContentsHelper
 include ActionView::Helpers
end
    mate `gem which actionpack`../action_view