4

我有一个带有名为 :published 的布尔值的 post 对象。控制器中 index 的定义如下所示:

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 的帖子的选项?是真的。

  • 我是否应该在控制器中使用单独的方法来处理仅显示 :published 帖子的情况?
  • 我可以更改索引方法来处理传递给它的参数吗?
  • link_to 会是什么样子?
4

2 回答 2

3

理论上,对于按关键字/类别过滤结果,可以通过参数在同一个控制器中显示逻辑。我会这样:

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

然后在您的控制器/索引操作中:

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

于 2012-08-27T20:05:09.577 回答
2

To keep it really simple (no scopes), just do the following

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

And then to add the link with params do

%= link_to 'Published Posts', posts_path(:published => true) %>
于 2012-08-27T20:47:38.487 回答