2011-07-23 12 views
2

レールで作業を始めたばかりですが、私は間違っていることがわかっていますが、私の人生ではわかりません。Rails:未定義のメソッドエラー

私はコントローラに単純なメソッドを定義して、 "ショート"と呼ばれる "ポスト"を作成しようとしています。これは、渡す文字列の短縮バージョンを返します。私のposts_controller.rbに、私は以下を書いています。

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

私のビューから呼び出そうとすると、定義されていないメソッドエラーが発生します。私はポストのインスタンス内からそれを呼び出すので、私は自分が必要ではないと仮定しました。私は先に進んで、とにかくメソッド定義に自分自身を前もって試してみましたが、それでも動作しませんでした。

+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行は使用しないでください)。すでに

<%= post.shorten %> 

しかし、Railsの:

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

その後、あなたはこのようにそれを呼び出すことができます。しかし、私はむしろそれを文字列を渡すよりも、あなたは自分のフィールドのいずれかを使用するようにしたいと思うことを前提としていtruncate方法は、あなたの代わりに使用することができることで構築しています

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

あなたが提案したことをやってみましたが、同じエラーが発生しました: – Dan

+0

あなたの使っているコードは何ですか? 'post.shorten(...)'や 'shorten(...)'をやろうとしていますか? –

+0

私はpost.shortenをやろうとしていました。投稿なしでうまくいきましたが、私がクラスでメソッドをソートできない場合、今からどのような意味があるのだろうかと思います。 – Dan

関連する問題