0

在我的 Rails 应用程序中,我有一个update操作users可以用来更新他们的个人资料。

我想要实现的棘手事情是,如果用户输入一个的电子邮件地址并保存它,该电子邮件地址不会立即保存到email数据库字段,而是保存到名为new_email. 该字段email应保持不变(至少在user稍后确认该电子邮件地址之前)。

def update
  current_email = @user.email
  new_email = params[:user][:email].downcase.to_s
  if @user.update_attributes(params[:user])    
    if new_email != current_email
      @user.change_email(current_email, new_email)     
      flash[:success] = "Profile updated. Please confirm your new email by clicking on the link that we've sent you."
    else
      flash[:success] = "Profile updated."
    end
    redirect_to edit_user_path(@user)
  else
    render :edit
  end
end

用户型号:

def change_email(old_email, new_email)
  self.new_email = new_email.downcase 
  self.email = old_email
  self.send_email_confirmation_link
end 

上面的功能可以工作,但很难测试并且感觉不对。有没有更顺畅的方法来实现这一目标?

谢谢你的帮助。

4

2 回答 2

3

如果您更改表单以进行更新new_email,则可以将其全部放在一个简单的after_update挂钩中。

after_update :check_new_email

private
  def check_new_email
    send_email_confirmation_link if new_email_changed?
  end
于 2013-06-24T13:58:18.533 回答
0

我认为您可以使用“虚拟”属性,称为 - 比如说 -email_input并在视图中显示该属性的字段(而不是email):

<%= f.text_field :email_input %>

然后在你的模型中你应该有:

class User < ActiveRecord::Base
  attr_accessor :email_input
  attr_accessible :email_input
  before_save :set_email, :if => lambda{|p| p.email_input.present?}

  # ...
  def set_email
    email_input.downcase!
    if new_record?
      self.email = email_input
    else
      self.new_email = email_input
      send_email_confirmation_link
    end
  end
end
于 2013-06-24T13:31:04.227 回答