我的申请由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方法是什么?
答案 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