2017-01-04 12 views
0

Я пытаюсь разрешить либо хэш с определенными значениями, либо значение nil через сильные параметры. Теперь у меня есть следующие:Разрешить хэш или ноль с сильными параметрами

params.require(:parent).permit(child: [:attr1, :attr2]) 

Если я называю это действие с:

{ "parent": { "child": nil }} 

Rails не допускает параметр ребенка. (Unpermitted parameter: child)

Как убедить рельсы, что и nil, так и хэш разрешены? Я знаю, что вы можете разрешить нулевые значения:

params.require(:parent).permit(:child, child: [:attr1, :attr2]) 

Но это также позволяет использовать строковые значения.

+0

Вы пытаетесь разрешить ввод хеша или принимать вложенные ресурсы? это очень разные варианты использования – TheRealMrCrowley

ответ

2

Лучше всего, чтобы сделать здесь, я думаю, чтобы все значения, делая это:

params.require(:parent).permit(:child) 

Это должно позволить что-либо до конца, даже ноль, но затем проверить тип, написав свой собственный Проверка.

validate :child_is_nil_or_hash 
... 
def child_is_nil_or_hash 
    unless child.is_a?(Hash) || child.nil? 
    errors.add(:child, 'must be nil or a hash') 
    end 
end 

или что-то в этом роде. Я не тестировал этот код правильно.

В этом примере вы переносите ответственность за проверку вдали от параметра «белый список» и для проверки правильности Rails, где он принадлежит.

+0

Это точно такое же решение, как 'params.require (: parent) .permit (: child, child: [: attr1,: attr2])' только более опасно, так как он позволяет любому атрибуту в хэш. – Roy

+0

@Roy: вы нашли решение? – thiebo

+0

@Roy это правильный ответ. сильные параметры - это настройка того, какие ключи должны быть разрешены. это абсолютно не опасно. валидация того, что разрешено для этого ключа, теперь находится в проверке модели, где она должна быть. в коде, который он опубликовал выше, eveything, кроме ввода хеша или значения nil, выдает ошибку – TheRealMrCrowley