2011-08-08 6 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 

그래서, 뭔가 재미가 일을

오류 메시지 : "test"에 대한 이름이 정의되지 않았습니다. 문자열

왜이 태그 객체가 아닌 문자열에서 이름을 호출하려고합니까? 내가 넣으면 너무 분명 내가 문자열 대신 객체의 배열을 얻기 위해 뭔가를 잘못하고있는 중이 야,보기에 따라 한 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 블록에는 넣지 않으면 어쨌든 Chuck이 아래에있는 더 좋은 방법을 게시했습니다. –

답변

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"는 뷰에 인스턴스 변수를 전달할 필요가 없으며 뷰에서 호출 할 수있는 컨트롤러에서 "노출"을 통해 메소드를 만드는 것입니다. Railkeasts # 259 또는 Asciicasts 버전을 읽거나 Rubygems의 보석 문서를 확인하십시오 –

관련 문제