2013-11-23 79 views
34

我向控制器发送关联ID数组,例如foo_ids。要允许值的数组,我使用:现在Rails - 空阵列的强参数

params.permit(foo_ids: []) 

,问题是,如果我发送的foo_ids空数组,该参数将被忽略。不应将所有foos作为空数组进行清除,而是关联,因为不允许使用foo_ids

这可能是因为an empty array is converted to nil in rails,并且nil值被忽略,因为强参数正在寻找一个标量值数组,而不是单个标量值。

任何人都可以提出一个很好的方法来解决这个问题吗?谢谢!

其他信息

在更新控制器动作,我需要能够处理两种情况。我需要能够将foo_ids设置为空数组。如果我只想更新另一个字段,我还需要能够忽略foo_ids。如果nil不适用于第二种情况,则将foo_ids设置为空数组。

回答

18

治标不治本,我归结为是:

params[:foo_ids] ||= [] if params.has_key?(:foo_ids) 
params.permit(foo_ids: []) 

这里,foo_ids设置为仅传递了一个空数组。如果它未在请求中传递,则会被忽略。

我仍然希望找到一个更好的解决方案,因为这种事情在我正在进行的项目中会很常见 - 如果您有任何问题,请提出更好的建议。

+0

我正在考虑猴子补丁的before_filter在那里我会做些什么来解决这个问题的是,在“_ids”结尾的所有键。想法? – futbolpal

+1

这会工作。我有一些情况下需要为嵌套在哈希中的参数做这个工作,所以您可能也想根据您的使用情况来处理这些参数。 –

28

这是很晚了,但我自己只是有这个问题。我解决它通过包含在permit语句标版和数组版本,像这样:

params.require(:photo).permit(:tags, tags: []) 

仅供参考 - 它中都有相同的permit语句 - 如果你把它们连它会得到因某种原因被抛出。

编辑:我只注意到,通过这种方法提交的空数组将被转换为零 - 我现在有一堆字段,应该是空的数组是零。所以我发布的解决方案实际上并不适合我。

编辑第二个:以为我已经添加了这个,但是这个问题与Rails在params哈希上执行deep_munge有关。这个评论解释了如何解决它:https://stackoverflow.com/a/25428800/130592

0

我最近有同样的问题,但没有答案在这里为我工作。这是我的解决方案。如果你有JavaScript处理HTTP请求,这也可能适用于你。

在您的客户端:

if (photo.tags.length === 0){ 
    photo.tags = ["null"] 
} 

并在您PhotosController

def photo_params 
    p = params.require(:photo).permit(tags: []) 
    p["tags"].reject! { |tag| tag == "null" } 
    p 
end