【问题标题】:Rails: Why is etag not available in before_action?Rails:为什么 etag 在 before_action 中不可用?
【发布时间】:2014-10-02 13:02:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为什么不用像 etag {current_user.id} if current_user
  • @user3334690 undefined local variable or method 'current_user'
  • 如果已定义?(current_user) 也许?或者可能除非 self.try(:current_user).nil? ...我们不使用设计,所以我不确定当前用户的范围被定义为...
  • 因为如果它在 Devise 尚未初始化的范围内,它将始终为零。

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


【解决方案1】:

在您的第一个示例中,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 的 etagger 仅在您致电 fresh_when 时使用。

【讨论】:

  • 完美运行,所以 user_signed_in? 是在块中定义的,因为它是使用控制器实例作为上下文调用的?
猜你喜欢
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2013-05-07
相关资源
最近更新 更多