页面重定向后attr_accessor = nil?

时间:2016-10-21 19:46:56

标签: ruby-on-rails

我正在使用Hartl的Unicode NULL character

教程
user.rb
attr_accessor :activation_token

def User.digest(string)
  cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                              BCrypt::Engine.cost
  BCrypt::Password.create(string, cost: cost)
end    

# Returns a random token.
def User.new_token
  SecureRandom.urlsafe_base64
end

def send_activation_email
    UserMailer.account_activation(self).deliver_now
end

def create_activation_digest
  self.activation_token  = User.new_token
  self.activation_digest = User.digest(activation_token)
end

完成我的UsersController中显示的更新操作后,用户被重定向到root_url

def update
  @user = User.find(params[:id])
    ...
    elsif !params[:user][:email].blank?
      if @user.authenticate(params[:user][:current_password])
        @user.update_attributes(email_user_params)
        if @user.save
          @user.create_activation_digest
          @user.deactivated
          @user.send_activation_email
          log_out
          flash[:info] = "Please check email dude"
          redirect_to root_url
        else
          flash[:danger] = "Email Update Failed"
          redirect_to edit_user_email_path(@user)
        end
     else
       flash[:danger] = "Current Password Is Incorrect"
       redirect_to edit_user_email_path(@user)
     end
   ...

def edit
  @user = User.find(params[:id])
end    

然后:

  

:activation_token = nil。

这是对的吗?

我在问,因为有一个Account Activation主题允许用户在单独的控制器操作中请求第二个验证电子邮件,而在所有这些主题中讨论都停留在路由问题上,因为在发送的电子邮件中,:activation_token用作:id,错误消息显示为:id -> nil

编辑:

类AccountActivationsController< ApplicationController中

def edit
  user = User.find_by(email: params[:email])
    if user && !user.activated? && user.authenticated?(:activation, params[:id])
      user.activate
      log_in user
      flash[:success] = "Account activated!"
      redirect_to user
    else
      flash[:danger] = "Invalid activation link"
      redirect_to root_url
    end
  end
end

 user.rb
 def authenticated?(attribute, token)
    digest = send("#{attribute}_digest")
    return false if digest.nil?
    BCrypt::Password.new(digest).is_password?(token)
 end

2 个答案:

答案 0 :(得分:0)

所以看来,由于您正在使用虚拟属性在某个时间点存储该令牌,该对象正在离开作用域并被重新加载,或者甚至会导致您丢失上下文。最好的办法是在您的User表格中添加一列,以便在上下文之间保留它,并在适当的时候进行更新。

答案 1 :(得分:0)

我也遇到了这个问题。即使我删除了“ redirect_to root_url”,在代码运行到另一个动作(在同一控制器中)之后,attr_accessor仍然变为nil。

因此,我的结论是attr_accessor的生存期仅存在于同一动作中。