首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails 5.1 - JSON参数是允许的,但在日志中仍然打印为不允许的

Rails 5.1 - JSON参数是允许的,但在日志中仍然打印为不允许的
EN

Stack Overflow用户
提问于 2017-10-20 13:17:48
回答 1查看 1.8K关注 0票数 8

在Rails 4中,关于如何做到这一点的以下是问题所在。我想知道的是,虽然这是可行的,为什么日志仍在抱怨?

在Rails 5.1.3中,我有一个JSON列(letterhead)作为我的模型属性之一(在这个json列中有一个散列,它包含了我不关心白名单的各种属性)。我只想允许/白名单列本身。

Rails注释5.1.4

在5.1.4中有一种Rails方法可以实现这一点,请参阅此承诺。关于这一点,在github上有一个相当长的讨论这里。在Rails 5.1.4中,其内容很简单:

代码语言:javascript
复制
def account_params
  params.require(:account).permit(:id, :name, :plan_id, letterhead: {})
end

允许使用:letterhead参数,日志中没有错误显示,模型保存。但是很明显,它允许在参数内任意输入,所以小心使用。

如果您确实想限制在这样一个参数中允许哪些散列键,那么您也可以白名单这些,例如:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
def account_params
  params.require(:account).permit(:id, :name, :plan_id, :letterhead).tap do |whitelisted|
    whitelisted[:letterhead] = params[:account][:letterhead].permit!
  end
end

在这两种情况下,模型都保存,但在日志中仍然写着“不允许的参数:信笺头”。

  1. 当我明确允许的时候,为什么还要这样说呢?
  2. 此外,备选案文1和备选案文2之间是否有真正的区别?

编辑

数据如下:

代码语言:javascript
复制
{"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"}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-29 11:27:23

当我明确允许的时候,为什么还要这样说呢?

日志来自由#unpermitted_parameters!调用的#permit。所有这些都发生在调用#tap之前。

备选案文1和备选案文2之间有真正的区别吗?

这种差别归结为

代码语言:javascript
复制
params[:account].fetch(:letterhead, ActionController::Parameters.new).permit!

vs

代码语言:javascript
复制
params[:account][:letterhead].permit!

后者将导致NoMethodError,如果:letterhead没有通过,因为params[:account][:letterhead]将返回nil。前者返回参数的空散列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46849957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档