如何将多个值作为数组接入相同的键参数?

时间:2018-03-26 21:10:28

标签: ruby-on-rails arrays forms parameters

在阅读了SO上的不少主题以及各种书籍/网络资源之后,我仍然不知道如何正确设置参数键以便在单个表单上获取多个值

strong_parameters的自述文件似乎表明这可以通过将params哈希中的项声明为空数组来实现,例如params.permit(:id => [])

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

我也注意到param键显示为字符串,而不是数组。运行params[:document][:key].class返回String而不是Array。此外,当我尝试在表单的text_field中包含"name=key[]"选项时,它会抱怨“key []”:String的未定义方法“merge”。

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

documents_controller.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

_form.html.erb

<%= 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为数组赋予了一个“临时”主页,用于表单和参数哈希,目的是将它们的值传递给user_defined_attributes字段, 部分文件模型。只是把它扔到那里以防它成为问题的一部分。

1 个答案:

答案 0 :(得分:0)

感谢@TarynEast和@mu_is_too_short对此的评论!你们两个都很善良,StackOverflow更适合你们的社区! :)谢谢,谢谢!

现在,解决方案......

由于我正在设置数组变量(即键和值)来临时存储不直接属于Documents表的参数,因此解决方案是双重的。

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

首先,我使用

在document.rb中进行了实验
def initialize 
  @key = Array.new
  @value = Array.new
end

但这引发了一些争论错误。我不确定为什么,但我怀疑Rails 5对初始化的使用皱眉,因为ActiveRecord使用它进一步向上链自动设置attr_accessor方法......

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

<强> document.rb

after_initialize :create_key, :create_value

def create_key
  @key = Array.new
end

def create_value
  @value = Array.new
end

然后,将变量正确设置为数组,表单现在让我用带数组引用的字段命名(以前,它正确地抱怨键和值是字符串)。

<强> _form.html.erb

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

思考?批评?改进?我全都耳朵,愿意学习:)