簡體   English   中英

如何在Rails 4中實現強參數?

[英]How can I implement strong parameters in rails 4?

我的用戶模型如下(user.rb)

class User < ActiveRecord::Base
 validates :password, presence: true, length: { minimum: 6 }
 validates :password_confirmation, presence: true
 has_secure_password
 validates(:name, presence: true, length: {maximum: 50})
 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
 validates(:email, presence: true,format: { with: VALID_EMAIL_REGEX }, uniqueness: true)
end

我的UsersController如下(users_controller.rb)

class UsersController < ApplicationController
  def new
  end

  private
  def user_params
  params.require(:user).permit(:name)
  end
end

所以我應該只能批量更新(mass-assign)name屬性。

但是當我登錄到Rails控制台並鍵入以下命令時

user=User.find(1)
user.update_attributes(name: "ck",email: "ck@gmail.com", password: "ckck9090", password_confirmation: "ckck9090")
user.save

我仍然可以更新電子郵件。

我沒有在.permit()參數中提到:email屬性。 那么,如何仍然可以批量更新email屬性?

我想念什么嗎?

答案的關鍵在這里:

 def user_params
    params.require(:user).permit(:name)
 end

您正在通過Rails控制台進行測試,而不使用params哈希。 除非另有說明,否則Rails不知道您的參數來自何處,並且會使用它們。

如果您確實想看到自己強大的參數在起作用,我建議您這樣做:

  1. 在控制器中create一個create方法,並驗證您是否具有觸發它的正確路線
  2. 創建一個用戶,

像這樣:

@user = User.new user_params
@user.save
  1. 最后,您必須添加一個斷點,以便可以看到魔術。 我建議將byebug添加到您的Gemfile ,這樣,您可以通過在代碼中的任何位置添加byebugdebugger來停止執行。 所以總的來說,這看起來像

像這樣:

class UsersController < ApplicationController
  def new
  end

  def create
    @user = User.new user_params
    byebug
    @user.save
  end

  private
  def user_params
  params.require(:user).permit(:name)
  end
end

這不是很慣用,但應該可以說明。 從那里,您可以在REPL中輸入@user來查看其中的內容。 應該能夠看到正在發生的過濾。

據我所知,strong_parameters並不完全禁止使用質量分配,而只是禁止在質量分配中使用params作為參數。 因此,您仍然可以手動執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM