2010-04-15 4 views
0

마지막 질문에 KandadaBoggu의 도움을 많이 받았으며 매우 감사하고 있습니다. 우리가 코멘트에 묻히는 동안 나는이 부분을 깨고 싶었다.link_to 매개 변수 전달 및 문제 태그 기능 표시 - Ruby on Rails

내가 개발중인 레일 블로그에 태그 기능을 만들려고합니다. 관계는 게시물 has_many : 태그와 태그 belongs_to : post입니다. 게시물에 태그를 추가하거나 삭제하는 것이 효과적입니다.

내 /view/posts/index.html.erb 필자는 tags 테이블을 성공적으로 쿼리하고 태그 그룹을 그룹화하고 태그 이름 옆에 카운트를 표시하는 섹션을 가지고 있습니다 (부수적으로 태그 이름이 포함 된 열, 'name'대신 'tag_name'이 있어야 함). 또한이 그룹의 표시는 PostsController의 index 메소드를 참조하는 링크입니다. 그것이 바로 문제가되는 곳입니다.

/posts로 이동하면 태그 그룹 링크를 클릭하지 않고 매개 변수가 전달되지 않으므로 오류가 발생합니다. 나는 비어있다? 거기에서 무엇이 잘못되고 있는지 확실하지 않습니다. 당신이 empty?을 요구하고있다

오류

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.empty? 

/views/posts/index.html.erb

<% @tag_counts.each do |tag_name, tag_count| %> 
      <tr> 
       <td><%= link_to(tag_name, posts_path(:tag_name => tag_name)) %></td> 
       <td>(<%=tag_count%>)</td> 
      </tr> 
     <% end %> 

가 PostsController 여기

def index 
    @tag_counts = Tag.count(:group => :tag_name, :order => 'updated_at DESC', :limit => 10) 
    @posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].empty? ? {}: 
        { :tags => { :tag_name => params[:tag_name] }} 
        ) 
       ) 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
     format.json { render :json => @posts } 
     format.atom 
    end 
    end 

답변

0

내가 당신에게 해결책을 준 때, 나는 원숭이가 empty? 방법으로 내 Nil 클래스를 패치 한 사실을 잊고 있었다. 그것이 당신을 위해 일하지 않는 이유입니다.

변경 코드를 다음과 같이

conditions, joins = {}, nil 
unless(params[:tag_name] || "").empty? 
    conditions = ["tags.tag_name = ? ", params[:tag_name]] 
    joins = :tags 
end 
@posts=Post.all(:joins => joins, :conditions=> conditions) 

편집 한

위의 코드는 empty 검사 대신 nil 검사를 수행합니다. 나는 항상 쿼리 매개 변수에 대해 빈 검사를 수행하는 연습을합니다. 여기에는 검색 양식에서 조치가 호출되는 경우가 포함됩니다. 이 경우 tag_name은 nil이 아니고 빈 문자열이됩니다.

편집 2

는 여러 행 문제를 해결했습니다.태그 이름이있을 때 3

편집 나는 글을 더 쇼 문제를 해결하지 않습니다. 당신의 count 전화에서하여 order 절을 제거 DESC 순서로 카운트를 얻기 위하여

편집 4

.

@tag_counts = Tag.count(:group => :tag_name, :limit => 10) 

count 메서드는 count로 정렬 된 순서화 된 해시를 반환합니다. order 절을 추가하여 기본 정렬 순서를 변경했습니다.

+0

모든 도움을 주셔서 다시 한 번 감사드립니다. 위에 주어진 4 블록의 유일한 코드는 BaroqueBobcat에 의해 게시 된 두 번째 집합이지만 인덱스 뷰에 게시물을 여러 번 표시합니다. 실제로 표시되는 횟수는 해당 게시물의 태그 수와 직접적으로 관련이 있습니다. 그 문제를 해결하는 방법에 대한 아이디어가 있습니까? – bgadoci

+0

명확하게하기 위해 태그 그룹을 클릭하여 매개 변수를 전달할 때가 아니라 인덱스보기에서만 반복됩니다. – bgadoci

+0

답변을 업데이트했습니다. 픽스는 tag_name이있는 경우에만 조인을 사용합니다. –

0

다음은 오류 코드입니다 , 이 0이면보고있는 오류가 발생합니다.

@posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].empty? ? {}: 
        { :tags => { :tag_name => params[:tag_name] }} 
        ) 
       ) 

당신은 그냥 전무인지 아닌지 걱정 경우

, 당신은 전무는 falsey라는 사실을 활용이

@posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name] ? 
        { :tags => { :tag_name => params[:tag_name] }} : {} 

        ) 
       ) 

을하지만 아주 못생긴 수 있습니다. 그것은 당신이 무엇을하고 있는지가 명확하게하기 위해이 같은 일을하는 것이 더있을 수 있습니다

@posts = if params[:tag_name] 
      Post.all 
     else 
      Tag.find_by_name(params[:tag_name], :include => :posts).posts 
     end 
+0

좋아, 태그 그룹 링크가 작동/게시물하지만 두 가지 : 첫 번째, 각 게시물 항목을 한 번에 세 번씩 표시하는 것, 그리고 두 번째로 실제로 태그가있는 게시물 만 표시합니다 (3 회). 어떤 아이디어 (당신이 말할 수없는 경우 루비를 처음 사용). 도와 주셔서 감사합니다. – bgadoci

+0

또한 마지막으로 해결 된 솔루션을 시도했지만 '페이지'를 인식하지 못했습니다. – bgadoci

+0

사실, 반복 된 디스플레이는 게시물의 태그 수와 직접적으로 관련이 있습니다. 3 개의 태그 = 3 번 표시 등 – bgadoci

0

액세스하려는 매개 변수는 비어 있지 않고 nil입니다. 이 문제를 해결하는 한 가지 방법은 nil을 호출하는 것입니다. 비어있는 대신에? 귀하의 코드입니다. 이것은 나를 위해 일했다 :

@posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].nil? ? {}: 
        { :tags => { :tag_name => params[:tag_name] }} 
        ) 
       )