2010-12-16 92 views
0

我加@sort_by属性我控制器,并初始化它的值是这样的:Rails:为什么不使用默认的应用程序布局?

class ProductsController < ApplicationController 
    def initialize 
    @sort_by = :shop_brand 
    end 
    ... 
end 

这引起了默认应用程序布局不被使用。

为什么?

将属性添加到控制器并初始化它的正确方法是什么?

回答

6

覆盖构造函数可能是一个坏主意(正如你找到的)。你应该使用一个before_filter

class ProductsController < ApplicationController 

    before_filter :set_defaults 

    ... 

    private 

    def set_defaults 
    @sort_by = :shop_brand 
    end 

end 

但是,它听起来像你想保持状态。最简单的是存储在将每个用户自动保存用户的会话,直到他们关闭浏览器:

def set_defaults 
    session[:sort_by] ||= :shop_brand 
end 

另一种选择是在URL传递当前sort_by值。这很难实现,因为您需要确保每个链接或表单将值复制到下一个请求。然而,这样做的好处是用户可以使用不同的顺序打开多个选项卡,任何书签链接下次都可以恢复相同的顺序。这是像搜索引擎一样使用的方法。

+0

而且,如果'sort_by'永远不会改变,它可能在类的基础上作为一个常量'SortBy'变得更好:) – Matchu 2010-12-16 02:13:03

+0

'sort_by'可能会改变,所以它不能是一个常量。此外,在您的代码中,@ sort_by将在每个动作之前设置,但我只想设置默认值(':shop_brand')一次!每次调用'index'方法时,我都不想设置默认值! – 2010-12-16 02:17:42

+0

嗯,我想我可以做'@sort_by || =:shop_brand',但我想知道是否有更好的方法,每次都不会调用'set_defaults'? – 2010-12-16 02:25:40

相关问题