2011-07-23 108 views
2

我刚开始使用rails,我知道它一定是简单的我做错了,但对于我的生活我无法弄清楚。Rails:未定义的方法错误

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

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

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

+1

你不能从一个视图调用一个控制器,你要找的东西可能是一个视图助手方法。查找一个名为posts_helper.rb的文件,并将此方法添加到该文件中,这样,您可以通过执行以下操作来调用它:<%= shorten(post.title)%> –

+0

啊谢谢。我没有意识到我需要删除缩短的“帖子”。这意味着什么将我的方法分解成类? – Dan

回答

4

默认情况下,控制器中定义的方法仅适用于您的控制器,而不适用于您的视图。

处理此问题的首选方法是将您的方法移至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) %> 
+0

我试着做你的建议,但我得到了同样的错误: – Dan

+0

你使用的确切代码是什么?你想要做'post.shorten(...)',还是'缩短(...)'? –

+0

我正在尝试做post.shorten。它在没有帖子的情况下工作,但是我想知道如果我不能按类来排序我的方法,那么从现在开始会有什么影响。 – Dan

相关问题