我第一次在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,就像我在很多例子中看到的那样。
答案 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 POST
或PUT
嵌套数据的属性的示例:
<input type="text" name="parent[data][your_super_custom_nested_data]
/>`
第四个示例:https://guides.rubyonrails.org/action_controller_overview.html#more-examples