2011-07-23 213 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

相關問題