我的模型中有一个来自rgrove sanitize gem的清理方法
Micropost
belongs_to :user
def sanitized_gif_url
self.gif_url = Sanitize.fragment(micropost.gif_url, elements etc to sanitize here).html_safe
end
我想在我的微博视图中调用sanitized_gif_url
但是当我使用此代码时,我得到undefined local variable or method sanitized_gif_url' for #<#<Class:0xb886cf0>
我只是非常模糊地理解实例/类方法,但我知道我想在我的视图中调用我的方法在我的微博实例上。当我调用self.gif_url
引用db中的原始对象然后在实例上运行我的方法时,我以为我已经这样做了。
**编辑:gif_url
是我要清理的属性。
查看代码
_micropost.html.erb
....
<%= sanitized_gif_url %> (I know this doesnt look right)
....
答案 0 :(得分:1)
您已将sanitized_gif_url
编写为实例方法,这意味着必须在Micropost
类的实例上调用它。
您所说的视图的控制器应将Micropost
实例的集合设置为要访问的视图的实例变量。像@micropost = Micropost.find(params[:id])
之类的东西(在视图中获取您正在使用的Micropost
的特定实例)
然后在视图中以这种方式修改你拥有的内容:
<%= @micropost.sanitized_gif_url %>
在类的一个实例上调用实例方法。在类本身上调用类方法。
答案 1 :(得分:1)
如果没有将方法显式传递给对象,则会将其传递给self
,它在视图中表示视图实例。因此,您需要将方法传递给Micropost实例(例如@micropost.sanitized_gif_url
)。它的方法定义也有一些错误:
##Micropost.rb
##micropost in micropost.gif_url is undefined. you can use self.gif_url or just gif_url, as self is implied.
##I'd remove "self.gif_url =" too unless this is used in a callback to sanitize url before saving
def sanitized_gif_url
self.gif_url = Sanitize.fragment(gif_url, elements etc to sanitize here).html_safe
end
但是,如果这样做的目的是在视图中显示已清理的方法,我建议您创建一个视图助手而不是Micropost的方法。
##helpers/application_helper.rb
def sanitized_gif_url(url)
Sanitize.fragment(url, elements etc to sanitize here).html_safe
end
## _micropost.html.erb
<%= sanitized_gif_url(@micropost.gif_url) %>
这样做的好处是可以分离对模型和视图的关注。您还消除了#sanitized_gif_url
对Micropost特定实现的依赖性。因此,您可以将此方法用于任何其他具有您要清理的网址的网址或模型。