如何在 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 不知道您的论点来自何处,除非另有说明,否则将使用它们。
如果你真的想看到你强大的参数在起作用,我建议你这样做:
- 在你的控制器中创建一个
create
方法并验证你有正确的 routes 来触发它
- 创建用户,
像这样:
@user = User.new user_params
@user.save
- 最后你必须添加一个断点,这样你就可以看到魔法了。我建议将 byebug 添加到您的
Gemfile
,这样您就可以通过在代码中的任意位置添加 byebug
或 debugger
来停止执行。所以总的来说,这看起来有点
像这样:
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
以查看其中放了什么。您应该 能够看到正在发生的过滤。
我的用户模型如下(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 不知道您的论点来自何处,除非另有说明,否则将使用它们。
如果你真的想看到你强大的参数在起作用,我建议你这样做:
- 在你的控制器中创建一个
create
方法并验证你有正确的 routes 来触发它 - 创建用户,
像这样:
@user = User.new user_params
@user.save
- 最后你必须添加一个断点,这样你就可以看到魔法了。我建议将 byebug 添加到您的
Gemfile
,这样您就可以通过在代码中的任意位置添加byebug
或debugger
来停止执行。所以总的来说,这看起来有点
像这样:
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
以查看其中放了什么。您应该 能够看到正在发生的过滤。