2012-08-27 47 views
3

我有一個名爲publish的布爾對象。在控制器指數的定義是這樣的:將布爾參數傳遞給rails控制器?

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

爲了保持它非常簡單(沒有範圍),只要做到以下

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

然後添加鏈接使用參數做

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

事情是,如果你這樣做,你*需要*爲參數指定一個值,否則Rails丟棄它。 這很令人困惑: 'link_to'發佈的帖子',posts_path(:published => false)'=>仍然會包含發佈的帖子 –

2

理論上,爲了過濾關鍵字/類別的結果,可以通過param在同一個控制器中顯示邏輯。我將它作爲:

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

然後在你的控制器/ index動作:

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

重構你的代碼,我會範圍的模型的方法,用這樣的:

scope :published, where(: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)在控制檯中工作。有些帖子的發佈是真實的。我不確定如何測試代碼是否正在執行。我認爲這個參數可能沒有被通過。 –

相關問題