Установка hstore в rails4, динамический ключ / значения

Я впервые играю с Hstore в приложении rails4 и использую javascript в форме для создания полей динамической формы для столбца hstore (: схема)

В рейках 4 мне не нужно добавлять какой-либо метод установки / получения в моей модели, правильно?

В своей форме я строю динамические поля ввода и позволяю пользователю устанавливать пары ключ / значение. Очень похоже на демо-приложение Hstore Heroku

Так что в основном моя форма будет иметь такие данные, как

input name="app[schema][dynamic_key1]" value="whatever value"
input name="app[schema][dynamic_key2]" value="whatever value2"

В моем контроллере приложений:

def app_params
  params.require(:app).permit(:name, :title, :schema )
end

Тем не менее, когда я создаю новую запись приложения, значения моей схемы не сохраняются. Я видел кое-что о создании сильного параметра для :schema => [], но это все равно не работает.

Поскольку я не знаю, какими будут эти значения, я не могу настроить store_accessors для них, как я видел во многих примерах.

2 ответа

Решение

Нашел это здесь: http://guides.rubyonrails.org/action_controller_overview.html

и в моем контроллере я использовал:

def app_params
  params.require(:app).permit(:name, :title).tap do |whitelisted|
    whitelisted[:schema] = params[:app][:schema]
  end
end

Я думаю, что Rails, должно быть, упростил это в последних версиях (по крайней мере, в версии 5.2.3)... и намного чище / проще:

params.require(:parent).permit(:name, :whatever, data: {})

Это позволит хранить любые / все атрибуты data в hstoreполе. ПримерPOSTing или PUTвставка вложенного атрибута данных через HTML:

<input type="text" name="parent[data][your_super_custom_nested_data] />`

4-й пример вниз: https://guides.rubyonrails.org/action_controller_overview.html

Вот способ, который также позволяет удалять ключи hstore, передавая пустые параметры.

В вашем ApplicationController добавьте этот метод:

# Returns the hstore keys to be whitelisted.
#
# @param key [Symbol] the name of the hstore field
# @param params [Hash] the parameters for the hstore field
#
# @return [{Symbol => Array<Symbol>}, Symbol]
def permit_hstore_params(key, hstore_params)
  keys = hstore_params.try(:keys)

  # Return key if params are empty, 
  # this allows the hstore key to be removed.
  return key if keys.blank?

  # Otherwise, return the keys to be whitelisted
  { key => keys }
end

Пример:

class DynamicRecord < ActiveRecord::Base
  store_accessor :metadata
end

class DynamicRecordController < ApplicationController
  # ...

  def dynamic_model_params
    params
      .require(:dynamic_model)
      .permit(:name, permit_hstore_params(:metadata, params[:dynamic_model][:metadata]))
  end
end
Другие вопросы по тегам