什么需要'定义强参数时做什么?

时间:2017-08-18 03:42:46

标签: ruby-on-rails ruby parameters ruby-on-rails-5

我有一个带用户模型的简单应用程序,这是它的表:

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这里是否做了类似的事情? 这两种用法之间的区别是什么?有人可以解释一下,还是举一个简单的例子?

谢谢!

1 个答案:

答案 0 :(得分:1)

根据documentation强参数:

  

允许您选择应将哪些属性列入白名单以进行批量更新,从而防止意外暴露不应公开的属性

通过定义

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

require使用userpermit用户包含多个字段的参数。如果您或第三方请求中不包含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

希望它澄清。