Рельсы 4 сильных параметра + динамические клавиши hstore
У меня возникла проблема с преодолением нового сильного параметра в Rails 4 с использованием Hstore и динамических аксессуаров
У меня есть столбец Hstore под названием :content
, который я хочу использовать для хранения контента на нескольких языках, т.е. :en, :fr
и т.д. И я не знаю, на каком языке он должен быть настроен либо в модели, либо в контроллере.
store_accessor :content, [:en, :fr] #+226 random other il8n languages won't work.
Как я могу переопределить сильные параметры (или включить динамические ключи hstore) в rails 4 для одного столбца?
params.require(:article).permit(
:name, :content,
:en, :fr #+226 random translations
)
За исключением...
params.require(:article).permit!
который, конечно же, работает.
Ответы
Ответ 1
Если я правильно понимаю, вы хотите, чтобы белый список хэшей динамических клавиш. Вы можете использовать код ruby
следующим образом:
params.require(:article).permit(:name).tap do |whitelisted|
whitelisted[:content] = params[:article][:content]
end
Это сработало для меня, надеюсь, что это поможет!
Ответ 2
Я делаю что-то подобное и считаю, что это немного чище и хорошо работает.
Предполагая модель под названием Article
, вы можете получить доступ к :content
индексированным stored_attributes
следующим образом: Article.stored_attributes[:content]
Итак, ваши сильные параметры выглядят так:
params.require(:article).permit(:name, content: Article.stored_attributes[:content])
Предполагая, что ваши параметры структурированы следующим образом: {article = > {name: "", content: [en, fr,..]}}
Ответ 3
Как говорили люди, недостаточно разрешить параметр: content - вам нужно также разрешить ключи в хэше. Сохраняя вещи в политике, я сделал это так:
# in controller...
def model_params
params.permit(*@policy.permitted_params(params))
end
# in policy...
def permitted_params(in_params = {})
params = []
params << :foo
params << :bar
# ghetto hack support to get permitted params to handle hashes with keys or without
if in_params.has_key?(:content)
content = in_params[:content]
params << { :content => content.empty? ? {} : content.keys }
end
end