使模块中的所有ActionViewer辅助方法可用

时间:2011-06-07 14:47:28

标签: ruby-on-rails-3

我在rails 3上使用ruby。我有一个名为Content的模型。在控制器中,我提取一些变量并将它们传递给Viewer。在Viewer中,我想使用我自己创建的函数,这样我在Viewer中就没有太多的逻辑和代码。我在ContentsHelper模块中定义了这些函数。

我在ContentsHelper模块中定义的函数正在使用ActionViewer辅助函数,但这些函数在ContentsHelper模块中不可用。我得到例如NoMethodError: undefined method content_tag' for #<Content:0x1025b9458>错误。

如何使所有ActionViewer辅助函数可用?

新手。

根据蒂姆的建议:

module ContentsHelper
include ActionView::Helpers
  def bla
    content_tag(:h2, self.title)        
end

我可以在控制台中将bla方法作为Content.bla运行。这很完美!

但是,当我用content_tag替换image_tag时,我遇到了麻烦并收到此错误:

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方法的模块缺少“某些东西”。如果你们告诉我找到缺失的一般方法以及如何解决问题,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

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

相反,这里有一些代码:

应用程序/助手/ contents_helper.rb

module ContentsHelper
  def foo
    content_tag :p, "Foo"
  end
end

应用程序/视图/内容/ index.html.erb

<h1>Listing Contents</h1>

<%= foo %>

转到/ content URL

时的HTML输出
<h1>Listing Contents</h1>

<p>Foo</p>

这就像现在这样艰难。

答案 1 :(得分:2)

content_tag:

这有用吗?

module ContentsHelper
 include ActionView::Helpers
end

IMAGE_TAG:

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

我为我们设置了一个要点,以模拟您需要的功能:

https://gist.github.com/1015333

你应该可以下载并运行forNoNameNo.rb(它应该安静地运行而不会出错。)

该文件包含使image_tag有效所需的一些示例。


进一步讨论:

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

为了处理由此产生的代码组织问题,人们倾向于Presenter pattern。 (另见rbates' version

那就是说,如果你更喜欢偏离轨道中的常规路径,那么阅读源代码通常非常有用。

如果您使用的是textmate:

    mate `gem which actionpack`../action_view
在Terminal.app中的

应该到达那里。如果您正在使用其他编辑器/操作系统,则可能需要导航到gem which actionpack告诉您的用途。