我有一个带用户模型的简单应用程序,这是它的表:
create_table "users", force: :cascade do |t|
t.string "email"
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
.
.
.
end
在users_controller
中,我们通常会定义一个私有方法user_params
来传递允许的参数,例如:
params.require(:user).permit(:email, :password, :password_confirmation, :name)
我的问题是require
。在rubyonrails' api doc中,它说:
"当传递单个键时,如果它存在并且其相关值存在或单例为假......当给出一个键数组时,该方法试图要求它们中的每一个订购。如果成功,则返回具有相应返回值的数组......否则,该方法重新引发找到的第一个异常..."
但在前面的示例app/views/users/new.html.erb
页面中,如果我将:name
列留空,我仍然可以成功提交。我试图改变这样的界限:
params[:user].permit(:email, :password, :password_confirmation, :name)
它仍然有效。虽然传递参数键:user
时有点不同。
Rails可以通过在model.rb中使用验证来检查列的存在。 require
这里是否做了类似的事情?
这两种用法之间的区别是什么?有人可以解释一下,还是举一个简单的例子?
谢谢!
答案 0 :(得分:1)
根据documentation强参数:
允许您选择应将哪些属性列入白名单以进行批量更新,从而防止意外暴露不应公开的属性
通过定义
params.require(:user).permit(:email, :password, :password_confirmation, :name)
您require
使用user
和permit
用户包含多个字段的参数。如果您或第三方请求中不包含user
,则会引发有意义的异常:
ActionController::ParameterMissing: param is missing or the value is empty: user
如果控制器中包含以下代码,请尽量不要传递user
:
params[:user].permit(:email, :password, :password_confirmation, :name)
您会收到不太可读的经典undefined method permit for nil:NilClass
希望它澄清。