【问题标题】:setting hstore in rails4, dynamic key/values在 rails4 中设置 hstore,动态键/值
【发布时间】:2013-10-03 23:22:16
【问题描述】:

我第一次在 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"

在我的应用控制器中:

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

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

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

【问题讨论】:

  • 您能否为布局/控制器添加(form_for 的重要部分)完整代码?

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


【解决方案1】:

在这里找到这个: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

【讨论】:

  • 我认为您可能希望根据您指出的 Rails 指南更新您的答案。他们目前使用此代码:params.require(:product).permit(:name, data: params[:product][:data].try(:keys))
  • 根据 5.1 的文档,Alexander 的解决方案仍然有效,让我摆脱了 hstore/strong 参数问题!谢谢!
【解决方案2】:

我认为 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#more-examples

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多