Ruby on rails RubyonRails用户确认未更新参数
在我的应用程序中,我有一个用户确认过程。当用户注册时,会发生四件事:Ruby on rails RubyonRails用户确认未更新参数,ruby-on-rails,ruby-on-rails-3.1,Ruby On Rails,Ruby On Rails 3.1,在我的应用程序中,我有一个用户确认过程。当用户注册时,会发生四件事: 帐户状态id设置为1(未确认) 用户已登录(当前用户已存在) 生成一个新的\u帐户\u确认\u令牌 将向新用户发送一封确认电子邮件,其中包含一个包含新帐户确认令牌的链接 我最初尝试用这种方法处理确认链接。它找到了没有问题的用户,代码通过update_属性流动!方法,但它没有更新帐户状态。据我所知,这是由于当前用户对象存在,因此我试图更新的用户已经“在内存中”。对吗 def new_account_confirmation
def new_account_confirmation
@title = "Account Confirmation"
logger.info("User is not logged in")
@user = User.find_by_new_account_confirmation_token(params[:confirm_id])
if @user
@user.update_attributes!(:account_status_id => 2)
else
redirect_to root_path
end
end
我的工作如下。下面的代码可以工作,但我想知道为什么上面的代码不能工作。为什么不更新帐户状态
def new_account_confirmation
@title = "Account Confirmation"
if current_user
logger.info("User is logged in")
current_user.update_attributes!(:account_status_id => 2)
else
logger.info("User is not logged in")
@user = User.find_by_new_account_confirmation_token(params[:confirm_id])
if @user
@user.update_attributes!(:account_status_id => 2)
else
redirect_to root_path
end
end
end
即使您的用户如您所说“在内存中”,也没有理由不更新。我相信您的更新正在发生,但您只是没有看到它,因为当前用户
与@user
不同步
我不知道你是如何验证
@user
没有被更新的,但是如果更新属性
没有抛出错误,然后它被保存。您能确认第一组代码是否更新了数据库中的行吗?看起来是对的。但是是的,我想,因为当前的用户在内存中,所以它不会更新。出于好奇,您是否正在序列化会话中的整个用户对象?一般来说,最好只存储id,并在请求时查询它,以便始终拥有最新的信息。第一种方法不更新数据库中的行。我只在会话中存储用户id,而不是整个当前用户对象谢谢您的回复。这是有道理的,但事实并非如此。我正在从rails控制台检查db(重新加载!我能想到的一切都刷新它),但它不会更新状态。是否有可能@user和current_user引用了两个单独的数据实例,但它们没有正确同步?从我看到的代码来看,如果用户以user1身份登录,但单击了user2的确认链接,则它们将不同步。您从不检查当前用户是否等于@user。但是很容易检查-在代码运行后,查看当前用户
和@user
是什么。