我在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方法的模块缺少“某些东西”。如果你们告诉我找到缺失的一般方法以及如何解决问题,我将不胜感激。
答案 0 :(得分:2)
看起来你正在尝试做一些奇怪的事情,比如在模型中使用辅助方法,而不是在视图中。辅助方法适用于视图,而不适用于模型。
相反,这里有一些代码:
module ContentsHelper
def foo
content_tag :p, "Foo"
end
end
<h1>Listing Contents</h1>
<%= foo %>
<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
告诉您的用途。