2011-08-08 5 views
0

有用な追加情報:私はdecent_exposureの宝石を使用しています、これは問題になる可能性がありますので - 以下のコードを修正:だから各メソッドの文字列を返すRubyオブジェクトの配列。どうして?

expose(:get_filter_tags) do 
    if params[:filter_tag_names] 
    filter_tag_names = Array(params[:filter_tag_names].split(" ")) 
    filter_tags = Array.new 
    filter_tag_names.each do |f| 
     t = Tag.find_by_name(f) 
     filter_tags << t 
    end 
    end 
end 

私はビューでこれを呼び出すとき、何かがおかしい起こる:

query string ?utf8=✓&filter_tag_names=test 

<% get_filter_tags.each do |ft| %> 
    <%= ft.name %> 
<% end %> 

エラーメッセージ: "test"の名前が未定義です。String

Tagオブジェクトではなく文字列の名前を呼び出すのはなぜですか?私はビューに次のように入れて、1つのfilter_tag_names項目に上記のような

def getfiltertag 
    Tag.find_by_name(params[:filter_tag_names]) 
end 

#view 
<%= getfiltertag.name %> 

query string: ?utf8=✓&filter=test 

を突出している場合、私は明らかに私は、文字列の代わりに、オブジェクトの配列を取得するには何か間違ったことをやって、うまく名前を呼び出すことができます。私はちょうど何がわからない。助言がありますか?

+1

'filter_tag_names = Array(:filter_tags).split(" "))'を 'filter_tag_names = params [:filter_tags]に変更したいかもしれません.split(" ")' – rubish

+0

面白いことがコードが働いた私はそれをINDEXメソッドに入れてもDECENT EXPOSUREブロックには入れませんが...とにかく、チャックは下の方が良い方法を投稿しました。 –

答えて

4

eachselfを返すため、filter_tag_names.eachと書くと、filter_tag_namesが返されます。明示的filter_tagsを返すことによってこの問題を解決することができますが、より多くの慣用的に、あなただけとしてそれを書き換えることができます:任意のフィルタタグ名が存在しない場合はさておき、このメソッドはnilを返します同じよう

expose(:get_filter_tags) do 
    if params[:filter_tag_names] 
    filter_tag_names = Array(params[:filter_tag_names].split(" ")) 
    filter_tag_names.map {|f| Tag.find_by_name(f) } 
    end 
end 

。これを行うこともできますし、呼び出しコードの例外を避けるために空のコレクションを返すこともできます。

+0

いつものように、分単位でStackOverflowが問題を解決しますそれは価値があったよりもはるかに長い時間麺の上に麺 - しかし、少なくとも私は途中で物事を学んだ:-) ...チャックこれはまさに私がする必要があったものです! –

+0

まともな露出を紹介してくれてありがとうございました。http://railscasts.com/episodes/259-decent-exposureでこれについて説明しました。 – rubish

+0

こんにちはRubish ... "decent_exposure"は、ビューにインスタンス変数を渡す必要がなく、代わりにビューで呼び出すことができるコントローラ内の "公開"を介してメソッドを作成する宝石です。 Railscasts#259を読んだり、Asciicastsのバージョンを読んだり、Rubygemsの宝石のドキュメントを確認したりしてください –

関連する問題