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 に答える