Rails:为什么不使用默认的应用程序布局?

Mis*_*hko 0 layout ruby-on-rails ruby-on-rails-3

我添加了@sort_by属性到我的控制器,并初始化它的值如下:

class ProductsController < ApplicationController
  def initialize
    @sort_by = :shop_brand
  end
  ...
end
Run Code Online (Sandbox Code Playgroud)

这导致不使用默认应用程序布局.

为什么?

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

Jas*_*red 6

覆盖构造函数可能是个坏主意(正如您所发现的那样).你应该使用before_filter:

class ProductsController < ApplicationController

  before_filter :set_defaults

  ...

  private

  def set_defaults
    @sort_by = :shop_brand
  end

end
Run Code Online (Sandbox Code Playgroud)

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

def set_defaults
  session[:sort_by] ||= :shop_brand
end
Run Code Online (Sandbox Code Playgroud)

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

  • Misha:要在请求之间保持状态,您需要在URL参数中传递它或使用会话.我在我的回答中添加了一个会话示例. (2认同)