在rails4中设置hstore,动态键/值

时间:2013-09-27 15:27:03

标签: ruby-on-rails postgresql ruby-on-rails-4 hstore

我第一次在rails4应用程序中使用Hstore,我在表单中使用javascript来构建hstore列的动态表单字段(:schema)

在rails 4中我不需要在我的模型中添加任何setter / getter方法,对吗?

在我的表单中,我正在构建动态输入字段并允许用户设置键/值对。很像Hstore Heroku Demo App

所以基本上我的表单会有像

这样的输入
input name="app[schema][dynamic_key1]" value="whatever value"
input name="app[schema][dynamic_key2]" value="whatever value2"

在我的App Controller中:

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

但是,当我创建新的App记录时,我的架构hstore值不会保存。我看到了为:schema =>制作强大的参数的一些事情。 [] 但仍然无效。

由于我不知道这些值是什么,我无法为这些设置store_accessors,就像我在很多例子中看到的那样。

3 个答案:

答案 0 :(得分:11)

在此处找到:http://guides.rubyonrails.org/action_controller_overview.html#more-examples

在我的控制器中我用过:

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

答案 1 :(得分:0)

这是一种允许通过提交空来删除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

答案 2 :(得分:0)

我认为Rails必须在最新版本中对此进行简化(至少从5.2.3开始有效)...并且更加简洁/容易:

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

这将允许并将data的任何/所有属性存储在hstore字段中。通过HTML POSTPUT嵌套数据的属性的示例:

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

第四个示例:https://guides.rubyonrails.org/action_controller_overview.html#more-examples