Unsuccessful edits

這節要實作失敗的編輯,我們要增加一個 update action,使用 update_attributes 方法把 params hash 傳入然後更新資料。如果資料無效的話,update 就會回傳 false,也就是會進入 else 分支,重新渲染編輯頁面:

app/controllers/users_controller.rb

class UsersController < ApplicationController

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      log_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      # Handle a successful update.
    else
      render 'edit'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

update_atrributes 的參數 user_params 就是之前定義的 strong parameters,防止 mass assignment 的漏洞。

因為之前已經做好 User model 的驗證還有在編輯頁面放了 error_messages 的 patial,所以如果提交無效的編輯資料,頁面就會顯示錯誤訊息: