在Rails 4中,关于如何做到这一点的以下是问题所在。我想知道的是,虽然这是可行的,为什么日志仍在抱怨?
在Rails 5.1.3中,我有一个JSON列(letterhead)作为我的模型属性之一(在这个json列中有一个散列,它包含了我不关心白名单的各种属性)。我只想允许/白名单列本身。
Rails注释5.1.4
在5.1.4中有一种Rails方法可以实现这一点,请参阅此承诺。关于这一点,在github上有一个相当长的讨论这里。在Rails 5.1.4中,其内容很简单:
def account_params
params.require(:account).permit(:id, :name, :plan_id, letterhead: {})
end允许使用:letterhead参数,日志中没有错误显示,模型保存。但是很明显,它允许在参数内任意输入,所以小心使用。
如果您确实想限制在这样一个参数中允许哪些散列键,那么您也可以白名单这些,例如:
def account_params
params.require(:account).permit(:id, :name, :plan_id, letterhead: [:address, :logo, :contact_info])
end这现在可以防止:letterhead中的任何其他任意键,因为我只显式地允许这些3- :address, :logo, :contact_info。
Rails 5.1.3 (及更早版本)
我可以允许本专栏使用以下任何一种方法(也请参阅链接讨论中的其他可能选项):
选项1
def account_params
params.require(:account).permit(:id, :name, :plan_id, :letterhead).tap do |whitelisted|
whitelisted[:letterhead] = params[:account].fetch(:letterhead, ActionController::Parameters.new).permit!
end
end选项2
def account_params
params.require(:account).permit(:id, :name, :plan_id, :letterhead).tap do |whitelisted|
whitelisted[:letterhead] = params[:account][:letterhead].permit!
end
end在这两种情况下,模型都保存,但在日志中仍然写着“不允许的参数:信笺头”。
编辑
数据如下:
{"id"=>"a61151b8-deed-4efa-8cad-da1b143196c9",
"plan_id"=>"1dc49acf-3111-4030-aea1-7db259b53a51",
"name"=>"Test Account 1",
"is_active"=>true,
"letterhead"=>{"left"=>"", "center"=>"", "right"=>""},
"created_by"=>nil,
"updated_by"=>nil,
"created_at"=>"2017-10-14T19:05:40.197Z",
"updated_at"=>"2017-10-20T15:14:08.194Z"}发布于 2017-11-29 11:27:23
当我明确允许的时候,为什么还要这样说呢?
日志来自由#unpermitted_parameters!调用的#permit。所有这些都发生在调用#tap之前。
备选案文1和备选案文2之间有真正的区别吗?
这种差别归结为
params[:account].fetch(:letterhead, ActionController::Parameters.new).permit!vs
params[:account][:letterhead].permit!后者将导致NoMethodError,如果:letterhead没有通过,因为params[:account][:letterhead]将返回nil。前者返回参数的空散列。
https://stackoverflow.com/questions/46849957
复制相似问题