Подтвердить что ты не робот

Рельсы 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!

который, конечно же, работает.

4b9b3361

Ответ 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