从模型实例中的模型视图调用方法,rails?

时间:2017-10-09 10:52:08

标签: ruby-on-rails ruby sanitize

我的模型中有一个来自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)
....

2 个答案:

答案 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特定实现的依赖性。因此,您可以将此方法用于任何其他具有您要清理的网址的网址或模型。