Rails - 销毁对象,redirect_to和double请求

时间:2013-09-25 17:20:00

标签: ruby-on-rails ruby

我是Rails的新手(我使用的是Rails 4.0.0)。我想从头开始编写用户管理,而不使用流行的解决方案。所以,这是我的问题。

我在UsersController中激活了操作:

# GET /users/activate/:code
def activate
  if Activation.activate(params[:code])
    redirect_to root_path, notice: t('users.activation.success')
  else
    redirect_to root_path, alert: t('users.activation.failure')
  end
end

这是激活模型中的激活方法:

def self.activate(activation_code)
  if a = Activation.find_by_code(activation_code)  
    a.destroy
    return true 
  else
    return false
  end
end

我的问题是,在传递有效代码以激活操作后,我收到了我的错误消息(users.activation.failure),但事实上,带有激活码的记录会从数据库中消失。在离开a.destroy取消注释时,我注意到日志中有些奇怪:

Started GET "/users/activate/f6dc4cccea5880d77821f0455ec9adf8" for 127.0.0.1 at 2013-09-25 18:53:54 +0200
...
Redirected to http://localhost:3000/
Completed 302 Found in 37ms (ActiveRecord: 30.5ms)

Started GET "/" for 127.0.0.1 at 2013-09-25 18:53:54 +0200
...
Completed 200 OK in 22ms (Views: 21.1ms | ActiveRecord: 0.0ms)

Started GET "/users/activate/f6dc4cccea5880d77821f0455ec9adf8" for 127.0.0.1 at 2013-09-25 18:53:55 +0200
...
Redirected to http://localhost:3000/
Completed 302 Found in 4ms (ActiveRecord: 0.7ms)

Started GET "/" for 127.0.0.1 at 2013-09-25 18:53:55 +0200
...
Completed 200 OK in 16ms (Views: 15.2ms | ActiveRecord: 0.0ms)

对一个实际请求有两个/users/activate/f6dc4cccea5880d77821f0455ec9adf8个请求。但是当我试图评论u.destroy时,似乎工作得很好(没有双重请求)。

我的问题:我做错了什么?

2 个答案:

答案 0 :(得分:0)

为什么需要单独的激活模型?只需将激活码和激活日期放入用户表即可。

答案 1 :(得分:-1)

我认为做变量赋值而不是评估条件就是问题所在。这将有效:

def self.activate(activation_code)
    a = Activation.find_by_code(activation_code)
    if a.present?  
      a.destroy
      return true 
    else
      return false
    end
end