0

私の Rails アプリケーションには、次の更新アクションがあります。

class UsersController < ApplicationController

  before_filter :authorized_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] = "Please click on the link that we've sent you."
      else
        flash[:success] = "User updated."
      end
      redirect_to edit_user_path(@user)
    else
      render :edit
    end
  end

  private

  def authorized_user
    @user = User.find(params[:id])
    redirect_to(root_path) unless current_user?(@user)
  end

end

class User < ActiveRecord::Base

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

end

これで、ブラウザで更新アクションを手動でテストすると、すべてが完全に機能します。

ただし、私が作成したRSpecテストは機能せず、その理由がわかりません。

it "changes @user's new_email" do
  @user = create(:user, email: "john@doe.com")
  put :update, id: @user, user: attributes_for(:user, email: "new@email.com")
  @user.reload
  expect(@user.new_email).to eq("new@email.com")
end

同じエラー メッセージが表示され続けます。

1) UsersController ユーザー アクセス PUT #update 有効な属性変更 @user's new_email 失敗/エラー: expect(@user.new_email).to eq("new@email.com")

   expected: "new@email.com"
        got: nil

   (compared using ==)

ここで何が欠けているのか誰か教えてもらえますか?

助けてくれてありがとう!

4

2 に答える 2

0

タイプミスがあると思います

expect(@user.email).to eq("new@email.com")

にユーザーを保存しておらず、コントローラーでchange_email更新emailしています。したがってnew_email、コードでは更新されません。

記録を保存するには

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

折り返し電話

次のようなものかもしれません:

# controller
if @user.update_attributes[:user]
  redirect_to somewhere
else
  render :edit

# model
after_update :change_email

しかし、これら以外にも変更があります。これは単なるスキーマです。

とにかく、コントローラーにコードを追加する代わりに、モデルでコールバックを使用する必要があるかもしれません。

于 2013-06-23T17:10:05.477 に答える