2014-10-02 14 views
0

我尝试添加使用etag添加的ETag与当前用户ID:Rails:为什么在before_action中etag不可用?

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

但是失败,因为当控制器类中定义的设计助手不可用: 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

+0

为什么不是像etag {current_user.id}如果current_user – user3334690 2014-10-02 13:05:06

+0

@ user3334690'未定义的局部变量或方法'current_user'' – max 2014-10-02 13:06:36

+0

if defined?(current_user)也许?或者可能除非self.try(:current_user).nil? ...我们不使用设计,所以我不确定范围current_user被定义为... – user3334690 2014-10-02 13:13:13

回答

3

在你的第一个例子中,self是类本身,所以虽然定义了etag方法,但是user_signed_in不是。轨忽略返回nil你任何ETAG块可以改为做

etag { current_user.id if user_signed_in? } 

或者干脆

etag { current_user.try :id} 

你的第二个和第三个例子不工作,因为Rails使用instance_exec评估块,所以self是您无法调用类方法的类的实例。

最后,我无法从你发布的内容中知道你是否已经意识到这一点,但只有在拨打fresh_when时才会使用添加了etag的etaggers。

+0

完美地工作,所以'user_signed_in?'在块中被定义,因为它是以控制器的一个实例作为上下文来调用的? – max 2014-10-05 17:20:43

+0

是的,这是正确的 – 2014-10-05 17:21:18

相关问题