2011-08-08 38 views
0

其他實用資訊:我使用的是decent_exposure寶石所以這可能是問題 - 修正代碼如下:在每種方法上返回字符串的Ruby對象數組。爲什麼?

query string ?utf8=✓&filter_tag_names=test 

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

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 

於是,有趣的東西時,我稱這種現象的看法發生

錯誤消息:未定義的方法名稱爲「測試」:字符串

爲什麼試圖調用字符串上的名稱而不是標籤對象?如果我把在視圖以下,並突出部分一個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(params [:filter_tags] .split(「」))'更改爲'filter_tag_names = params [:filter_tags] .split(「」)' – rubish

+0

有趣的是代碼工作如果我把它放在INDEX方法中,但不是在DECENT EXPOSURE塊中......但無論如何,查克發佈了一個更好的方法來做到這一點,下面... –

回答

4

你的問題是,each返回self - 所以如果你寫filter_tag_names.each,它返回filter_tag_names。你可以通過明確返回filter_tags解決這個問題,但更多的習慣用法,你可以只把它改寫爲:

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 

正如順便說一句,此方法將返回nil如果沒有任何過濾器標籤名。您可能想要這樣做,或者您可能想要返回一個空集合以避免調用代碼中的異常。

+0

哦,天啊,像往常一樣,在幾分鐘內StackOverflow解決了我的問題被浪費的時間遠遠超過它的價值 - 但至少我學到了一些東西:-) ...謝謝查克這正是我需要做的! –

+0

感謝您介紹體面暴露,我發現http://railscasts.com/episodes/259-decent-exposure談論它。 – rubish

+0

Hi rubish ...「decent_exposure」是一種避免將實例變量傳遞給視圖的gem,而不是通過在控制器中「展現」視圖可以調用的方法來創建方法......這真的很不錯......參見Railscasts#259或閱讀Asciicasts版本,或查看Rubygems –

相關問題