2012-08-27 3 views
3

게시 된 부울을 가진 게시 개체가 있습니다. 컨트롤러의 인덱스에 대한 정의는 다음과 같습니다부울 매개 변수를 레일 컨트롤러에 전달 하시겠습니까?

def index 
    @posts = Post.all 

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

그리고 해당 페이지에이 링크 :

<%= link_to 'All posts', posts_path %> 

이의 내가 post.published 만 게시물을 표시하는 옵션을 원하는 대신 가정 해 봅시다을? 사실이다.

  • 게시 된 게시물 만 표시되는 경우를 처리하려면 컨트롤러에 별도의 방법을 사용해야합니까?
  • 매개 변수를 전달하기 위해 인덱스 메서드를 변경할 수 있습니까?
  • link_to 모양은 어떻습니까?

답변

2

는 정말 간단 (NO 범위)를 유지하기 위해 바로 할 수는

def index 
    @posts = if params[:published].present? 
    Post.where(:published => true) 
    else 
    Post.all 
    end 
... 

다음 그리고 PARAMS 할에 링크를 추가 할

%= link_to 'Published Posts', posts_path(:published => true) %> 
+0

이런 식으로하면 매개 변수의 값을 지정해야합니다. 그렇지 않으면 레일스가 매개 변수를 버립니다. 그리고 이것은 꽤 혼란 스럽습니다. 'link_to '게시 된 게시물', posts_path (: published => false)'=>는 여전히 게시 된 게시물을 포함합니다 –

2

키워드/범주별로 결과를 필터링하려면 로직을 매개 변수를 통해 동일한 컨트롤러에 표시하는 것이 좋습니다. 내가 가진 것 그것과 같은 :

scope :published, where(:published => true) 
: 같은과

def index 
    @posts = Post.all 
    @posts = @posts.where(:published => true) if params[:published].present? 
    ... 

나는 범위 모델의 방법을 것, 코드를 리팩토링하려면 : 컨트롤러/index 액션에서 다음

<%= link_to 'All posts', posts_path(:published => true) %> 

그런 다음 컨트롤러에서 당신은 할 수 있습니다 :

@posts = @posts.published if params[:published].present? 
체인/모델 범위에 대한 자세한 내용은

: http://guides.rubyonrails.org/active_record_querying.html#scopes

+0

응답 해 주셔서 감사합니다. 그것은 나에게 오류를주지는 않지만 게시 된 게시물뿐만 아니라 모든 게시물을 나열합니다. –

+0

마지막에 디버깅을 할 수 있습니다. param이 전달되면 코드가 실행됩니까? '@ posts'가 게시 된 곳이 있습니까? Rails 콘솔에서'Post.where (: published => true)'를 실행하십시오. 그게 아무것도 돌려주지 않니? –

+0

Post.where (: published => true)는 콘솔에서 작동합니다. 게시 된 게시물이 있습니다. 코드가 실행되고 있는지 테스트하는 방법을 모르겠습니다. 나는 param이 전달되지 않을 수도 있다고 생각한다. –

관련 문제