如何在 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

所以我应该只能批量更新(批量分配)名称属性。

但是当我登录到 rails 控制台并键入以下命令时

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

我仍然可以更新电子邮件。

我没有在强参数.permit() 中提到:email 属性。那么我怎样才能仍然批量更新电子邮件属性呢?

我是不是漏掉了什么?

据我所知strong_parameters并没有完全禁止使用质量赋值,只是禁止使用params作为质量赋值的参数。因此您仍然可以手动执行此操作。

答案的关键在这里:

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

您正在通过 Rails 控制台进行测试,而不是使用 params 哈希。 Rails 不知道您的论点来自何处,除非另有说明,否则将使用它们。

如果你真的想看到你强大的参数在起作用,我建议你这样做:

  1. 在你的控制器中创建一个 create 方法并验证你有正确的 routes 来触发它
  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 以查看其中放了什么。您应该 能够看到正在发生的过滤。