5

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

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

在我的表单中,我正在构建动态输入字段并允许用户设置键/值对。很像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

但是,当我创建一个新的 App 记录时,我的架构 hstore 值没有保存。我看到了一些关于为:schema => []制作强参数的事情,但这仍然不起作用。

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

4

3 回答 3

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
于 2013-09-27T20:18:39.797 回答
1

我认为 Rails 必须在最近的版本中简化了这一点(至少从 5.2.3 开始)......而且更简洁/更容易:

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

这将允许并将任何/所有属性存储datahstore字段中。通过 HTML 对数据嵌套属性进行POSTing 或ing的示例:PUT

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

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

于 2019-08-27T08:22:28.713 回答
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
于 2014-10-08T19:51:38.820 回答