在Rails 4 here is the question中了解如何执行此操作。我想知道的是,尽管这行得通,但是为什么日志仍然提示?
在Rails 5.1.3中,我有一个JSON列(letterhead
)作为我的模型属性之一(并且在json内是具有各种属性的哈希,我不在乎将其列入白名单)。我只想允许/将列本身列入白名单。
关于Rails 5.1.4的说明
5.1.4中提供了一种Rails方法,请参见this commit。
对此,github上有一个相当长的讨论here。在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
在这两种情况下,模型均会保存,但在日志中仍会显示“未经许可的参数:letterhead”
编辑
数据是这样的:
{"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"}
最佳答案
为什么在我明确允许的情况下仍要说呢?
日志来自 #unpermitted_parameters!
的 #permit
。所有这些都发生在调用#tap
之前。
选项1和选项2之间有什么真正的区别?
差异归结为
params[:account].fetch(:letterhead, ActionController::Parameters.new).permit!
与
params[:account][:letterhead].permit!
如果未传递
NoMethodError
,则后者将导致:letterhead
,因为params[:account][:letterhead]
将返回nil
。前者返回一个空的参数哈希。关于ruby-on-rails - Rails 5.1-允许使用JSON参数,但在日志中仍显示为不允许,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46849957/