代码之家  ›  专栏  ›  技术社区  ›  Spectator6

如何将多个值作为一个数组接受到同一个键参数中?

  •  2
  • Spectator6  · 技术社区  · 7 年前

    在阅读了这里的许多线程以及各种书籍/web资源之后,我仍然不知道如何正确设置参数键,以便它在一个表单上接受多个值。

    strong\u参数的自述文件似乎表明这是可能的,它将params散列中的项声明为空数组,如下所示 params.permit(:id => [])

    但是,当我以这种方式设置参数哈希时,它仍然只能返回表单中设置的键的最后一个值,而不是用户提交的所有值的数组。

    我还注意到param键显示为字符串,而不是数组。跑步 params[:document][:key].class 返回字符串而不是数组。还有,当我尝试包括 "name=key[]" 表单的text\u字段中的选项,它抱怨“key[]”的未定义方法“merge”:String。

    知道我哪里出错了吗?我承认一些控制器代码可能有点粗糙,但在这一点上,我只是想让params散列返回一个k/v对数组。提前感谢您的帮助!

    documents\u控制器。rb型

    before_action :get_key_array, only: [:create, :update]
    before_action :get_value_array, only: [:create, :update]
    before_action :combine_key_array_and_value_array_to_create_jsonb_object, only: [:create, :update]
    before_action :save_jsonb_object_to_user_defined_attributes_field, only: [:create, :update]
    
    ...
    
    private
    
      params.require(:document).permit(:key => [], :value => [])
    
    # FIXME: Update to use push << ?
    def get_key_array
      unless params[:document].nil?
        @key_array = [params[:document][:key]]
        # @key_array << params[:document][:key]
      end
    end
    
    def get_value_array
      unless params[:document].nil?
        @value_array = [params[:document][:value]]
        # @value_array << params[:document][:value]
      end
    end
    
    def combine_key_array_and_value_array_to_create_jsonb_object
      unless @document.nil? || @key_array.nil? || @value_array.nil?
        @jsonb_object = jsonb_object(@key_array, @value_array)
      end
    end
    
    def save_jsonb_object_to_user_defined_attributes_field
      params[:document][:user_defined_attributes] = @jsonb_object
    end
    

    _表格。html。雇员再培训局

    <%= form_for @document do |document_form| %>
      <%= document_form.label :key %>
      <%= document_form.text_field :key %>
    
      <%= document_form.label :value %>
      <%= document_form.text_field :value %>
    
      <%= document_form.label :key %>
      <%= document_form.text_field :key %>
    
      <%= document_form.label :value %>
      <%= document_form.text_field :value %>
    <% end %>
    

    输入测试数据(如Key1、Value1、Key2、Value2)后,params散列表示只有第二组输入值被添加到params散列中

    Parameters: { ..., "document"=>{"key"=>"key2", "value"=>"value2"}, "commit"=>"Create Document"}  
    

    更新:如果重要的话,:key和:value数组本身不是文档模型的一部分。我用过 attr_accessor :key, :value 为数组值提供一个“临时”home,以便在表单和参数哈希中使用,目的是将其值传输到user\u defined\u attributes字段,该字段 文档模型的一部分。把这个扔出去,以防万一这是问题的一部分。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Spectator6    7 年前

    感谢@TarynEast和@mu\u is\u too\u的简短评论!你们俩对自己的时间都很好,StackOverflow更适合你们加入它的社区!:)谢谢,谢谢!

    现在,开始解决方案。。。

    由于我正在设置数组变量(即键和值)以临时存储不直接属于Documents表的参数,所以解决方案有两个方面。

    首先,在控制器中使用这些变量之前,我必须正确初始化这些变量。

    起初,我在文档中进行了实验。rb带

    def initialize 
      @key = Array.new
      @value = Array.new
    end
    

    但这带来了一些论点错误。我不知道确切的原因,但我怀疑Rails 5不赞成使用initialize,因为ActiveRecord使用它来自动设置attr\u访问器方法。。。

    然后我修改了数组创建以使用回调,这就成功了!

    文件rb型

    after_initialize :create_key, :create_value

    def create_key
      @key = Array.new
    end
    
    def create_value
      @value = Array.new
    end
    

    然后,在将变量正确设置为数组的情况下,表单现在允许我使用数组引用命名字段(之前,它正确地抱怨键和值是字符串)。

    _表格。html。雇员再培训局

    <%= document_form.text_field :key, name: "key[]" %>
    <%= document_form.text_field :value, name: "value[]" %>
    

    有什么想法?评论?改进?我洗耳恭听,愿意学习:)