2012-08-27 50 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)在控制台中工作。有些帖子的发布是真实的。我不确定如何测试代码是否正在执行。我认为这个参数可能没有被通过。 –

相关问题