【问题标题】:Rails executing if and else statementsRails 执行 if 和 else 语句
【发布时间】:2012-04-05 14:38:14
【问题描述】:

我正在尝试在我的应用程序中设置电子邮件验证流程,并且我生成了一个令牌,并在用户注册时向他们发送电子邮件。但是当我点击验证链接时,'users_controller/confirm' 操作中的 if 和 else 语句都会被执行。我被重定向到 root_path 但用户记录中的两个字段被修改。当我从 rails 控制台运行 find_by_token 时,它会返回预期的用户。我正在使用 mysql,我想知道查询中是否存在某种延迟会导致两者都执行。

  def confirm
    if User.find_by_token(params[:token]).nil?
      redirect_to root_path
    else
      @user = User.find_by_token(params[:token])
      cookies[:auth_token] = @user.auth_token
      User.skip_callbacks = true
      @user.update_attribute(:token, "")
      @user.update_attribute(:confirmed, 1)
      User.skip_callbacks = false
      reset_session
      redirect_to routes_path
    end
  end

【问题讨论】:

  • 这似乎极不可能。我建议向条件的每个分支添加一些输出,以便您可以查看执行了哪个。
  • 这是剪切粘贴的代码,还是您重新输入的? (我只是想知道如果您重新输入了实际代码中是否存在错字...)
  • 同意 - 此代码应按预期工作。如果实际代码略有不同,请注意调用 redirect_to不会停止操作的执行 - 您需要在它之后返回以强制执行。

标签: ruby-on-rails


【解决方案1】:

你可以像这样使用前置过滤器来检查和重定向

  before_filter :find_user

  def confirm
    #your action code
  end

  private
  def find_user
    @email = User.find_by_token params[:token].to_s
    redirect_to root_path, notice: 'Your token is wrong!' if @email.nil?
  end

这样,您的操作代码将仅针对有效记录运行。

【讨论】:

  • 这不是问题,但它让我走上了正轨。 else 块正在执行并且 cookie 正在创建中,但是由于我有一个辅助方法,一旦将 token 设置为空白,就会被销毁。感谢您的帮助!