过滤rails 3中的嵌套属性

时间:2012-10-02 15:41:32

标签: ruby-on-rails ruby-on-rails-3 view nested-attributes

我的申请由Category has_many products组成。类别和产品都有出版日期。

类别的显示页面显示该类别的产品。

Category_controller的show和index动作非常简单(发布是一个范围):

def index
    @categories = Category.published
end

def show
    @categories = Category.find(params[:id])
    unless @categories.datepublication <= Time.now
        redirect_to categories_path
    end
end

正如您所看到的,它会显示已发布的类别,并在您过于好奇时将其重定向到类别索引。

现在,只在类别的显示视图中显示已发布的产品会很棒。我不知道怎么做,除了在视图中使用if,但在我看来,过滤元素不是视图的工作。过滤嵌套元素的正确MVC方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以链接范围,甚至通过关联。从您的示例中我收集到您的类别有出版日期,但您的产品也有自己的出版日期,是吗?

在这种情况下,您可以在您的产品上设置类似于您的类别的范围,并以相同的方式使用它,即:

@products = @category.products.published

然后是否要在控制器中预加载@products实例变量,或者只是在视图中使用@ category.products.published由您决定。如果应用程序足够简单,我通常只在视图中使用范围查询。

答案 1 :(得分:1)

这是ORM的工作(也适用于类别)

 begin
   @category = Category.published.find(params[:id])
 rescue ActiveRecord::RecordNotFound
   redirect_to categories_path unless @category
 end

 @products = @category.products.published