我正在构建一个rails4 api,我发布了一个嵌套的属性哈希。但是,该模型实际上没有嵌套属性或关联。尝试通过将一些属性组合到一个组中来制作更干净的post params哈希,但让api处理解包和强参数验证。
closeLightbox()
但该模型实际上没有## Example POST params
params[:item][:group] = {
a: true,
b: false
}
列,属性group
和a
直接属于模型。
在没有b
包装器的情况下处理此问题只是
group
但我希望通过params.require(:item).permit(:a, :b)
包装器提交strong_parameters
。我如何实现这一目标,但如上所述有POST参数?
答案 0 :(得分:1)
您可以在调用操作之前删除所有中间级别:
class YourController < ApplicationController
before_action :flatten_item_params
private
def flatten_item_params
params[:item] = params.require(:item).each_with_object({}) do |(key, value), result|
result.merge!(value)
end
end
def item_params
params[:item].permit(:a, :b)
end
end
答案 1 :(得分:1)
关于&#34;嵌套&#34;的传递;参数,docs are pretty explicit;如果推荐Hoang Phan
,您可以将嵌套哈希传递给控制器:
params: {
object: {
title: "Test",
group: {
a: "test",
b: "test"
}
}
}
这可以通过以下方式接受:
def params
params.require(:object).permit(:title, group: [:a, :b])
end
-
问题,我相信所有的密钥都必须存在于模型中。要解决此问题,您可以使用virtual attribute
:
#app/models/your_model.rb
class YourModel < ActiveRecord::Base
attr_accessor :group, :a, :b
end
不保存虚拟属性,而是将实例方法附加到类中,允许您使用不需要放入数据库的数据填充它。
使用上面的 可以让你使用嵌套的params哈希;唯一的缺点是你必须坚持group: [:a, :b]
作为你的参数的结构。
答案 2 :(得分:0)
class YourController < ApplicationController
private
## POST { item: { group: { a: true, b: false } } }
def item_params
group = params[:item][:group].presence
if group
## Unwrap nesting and place at root of params[:item]
## Probably should explicitly handle this instead of iterating
group.each {|k,v| params[:item][k] = v }
params[:item].delete :group
end
params[:item].permit(:a, :b)
end
end