Rails:为什么etag在before_action中不可用?

时间:2014-10-02 13:02:18

标签: ruby-on-rails ruby devise http-caching

我正在尝试添加使用etag来添加包含当前用户ID的ETag:

UsersController:Class < ApplicationController 
  etag { current_user.id } if user_signed_in?
end

但是,由于在定义控制器类时Devise助手不可用,因此失败: undefined method `user_signed_in?'

如果我尝试在etag中使用before_action,则无法定义:

before_action do
 etag { current_user.try(:id) } if user_signed_in? # undefined method `etag'
end

我也尝试过:

before_action do
  self.etag { current_user.id } if user_signed_in? 
end

似乎没有添加额外的etagger

1 个答案:

答案 0 :(得分:3)

在第一个示例中,self是类本身,因此在定义etag方法时,user_signed_in不是。 Rails忽略任何返回nil的etag块,而不是

etag { current_user.id if user_signed_in? }

或只是

etag { current_user.try :id}

您的第二个和第三个示例不起作用,因为rails使用instance_exec来评估块,因此self是您无法调用类方法的类的实例。

最后,我不知道您发布的内容是否已经知道这一点,但只有在您拨打etag时才会使用fresh_when添加的电子邮件。