【问题标题】:Rails: Undefined method errorRails:未定义的方法错误
【发布时间】:2011-07-23 23:46:08
【问题描述】:

我刚开始使用 Rails,我知道这一定是我做错了一些简单的事情,但我这辈子都想不通。

我试图在我的控制器中为一个名为“shorten”的“post”定义一个简单的方法,它将返回我传递给它的任何字符串的缩短版本。在我的 posts_controller.rb 中,我放了以下内容;

def shorten(theString, length = 50)
if theString.length >= length
  shortened = theString[0, length]
else
  theString
end
end

试图从我的视图中调用它会给我一个未定义的方法错误。我在帖子的一个实例中调用它,所以我认为我不需要 self.shorten。我继续尝试将 self 添加到方法定义中,但它仍然不起作用。

【问题讨论】:

  • 您不能从视图调用控制器,您正在寻找的可能是视图辅助方法。查找一个名为 posts_helper.rb 的文件并将此方法添加到其中,这样您可以通过以下方式调用它:
  • 啊,谢谢。我没有意识到我需要从缩短中删除“帖子”。这对于将我的方法拆分为类意味着什么?

标签: ruby-on-rails ruby


【解决方案1】:

默认情况下,控制器中定义的方法只对控制器可用,视图不可用。

处理此问题的首选方法是将您的方法移动到您的 app/helpers/posts_helper.rb 文件中,然后它会在您的视图中正常工作。

如果您需要能够在控制器和视图中访问该方法,您可以将其保留在控制器中并添加 helper_method 行:

helper_method :shorten
def shorten(theString, length = 50)
  if theString.length >= length
    shortened = theString[0, length]
  else
    theString
  end
end

最后,如果您希望能够将其直接应用于模型,请将其放入您的 app/models/posts.rb 文件中(不带 helper_method 行)。但是,我假设您不想将其传递给字符串,而只想使用其中一个字段:

def shorten(length = 50)
  if description.length >= length
    description[0, length]
  else
    description
  end
end

那么你可以这样称呼它:

<%= post.shorten %>

但是,Rails 已经内置了一个 truncate 方法,您可以使用它来代替:

<%= truncate("My really long string", :length => 50) %>

【讨论】:

  • 您使用的确切代码是什么?你是想post.shorten(...),还是只是shorten(...)
  • 我正在尝试做 post.shorten。它在没有帖子的情况下工作,但我想知道如果我不能按类对我的方法进行排序,从现在开始会有什么影响。
  • 把它放在助手中只会使它对任何posts页面可用。请参阅我编辑的答案,了解如何将其添加到您的模型中。
猜你喜欢
  • 2013-12-27
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 2017-02-24
相关资源
最近更新 更多