Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails hidden_字段或JavaScript数组将作为逗号分隔的字符串而不是数组发布_Javascript_Jquery_Ruby On Rails_Arrays_Hidden Field - Fatal编程技术网

Rails hidden_字段或JavaScript数组将作为逗号分隔的字符串而不是数组发布

Rails hidden_字段或JavaScript数组将作为逗号分隔的字符串而不是数组发布,javascript,jquery,ruby-on-rails,arrays,hidden-field,Javascript,Jquery,Ruby On Rails,Arrays,Hidden Field,我曾经使用集合\u select,它使具有 这就是我希望它在控制器中的方式: def groupchat_params params.require(:groupchat).permit(:topic, {:user_ids => []}) end 问题:我试图用无序列表重新创建此功能,ul和li,因为这是跨平台列表选择器的共识。以下是我所拥有的: <ul id="special-select"> <%= f.hidden_field

我曾经使用
集合\u select
,它使
具有

这就是我希望它在控制器中的方式:

def groupchat_params 
  params.require(:groupchat).permit(:topic, {:user_ids => []}) 
end
问题:我试图用无序列表重新创建此功能,
ul
li
,因为这是跨平台列表选择器的共识。以下是我所拥有的:

      <ul id="special-select">
        <%= f.hidden_field :user_ids, { multiple: true, value: [] } %>
        <% User.where.not(id:current_user).each do |user| %>
          <li class="groupmember-select" id=<%= user.id %> value=<%= user.id %>>
            <%= user.name %>
          </li>
        <% end %>
      </ul>
当我选择一些项目并在浏览器控制台中将其签出时,它看起来是我所需要的格式:

> user_ids
["2", "6", "3"]
但是,我注意到,当我在浏览器中右键单击对象并粘贴它时,我会得到以下结果:

> user_ids
[0: "2", 1: "6", 2: "3", length: 3]
当我使用submit按钮发布上述表单时,我得到以下信息(所有项目都在一个字符串中,用逗号分隔):

我已经尝试了
JSON.stringify
(输出不变,看起来与上面相同)和
JSON.parse
(与我所需要的差不多,但是转义引号在后端的帖子中是可见的,不管这两种方法都不起作用

我以前也遇到过类似的问题,但那是在我有
:user_id
默认为数组之前


任何洞察都很好!

您不能只传递一个隐藏字段的数组。您需要做的是添加多个同名隐藏字段。生成的HTML应如下所示:

{"utf8"=>"✓",
 "authenticity_token"=>"redacted",
 "groupchat"=>{"topic"   =>"5dd",
               "user_ids"=>["5","6","7","8"]},
 "commit"=>"Done"}
<input value="1" multiple="multiple" type="hidden" name="groupchat[user_ids][]">
<input value="2" multiple="multiple" type="hidden" name="groupchat[user_ids][]">
<input value="3" multiple="multiple" type="hidden" name="groupchat[user_ids][]">
Javascript部分:

var selectedUsers = [];
$("#special-select li").click(function(){
  var index = selectedUsers.indexOf($(this).attr("data-hidden-field-tag"));
  if (index > -1) {
    selectedUsers.splice(index, 1);
  }
  else {
    selectedUsers.push($(this).attr("data-hidden-field-tag"));
  }
  $("#hidden-fields").html(selectedUsers);
  $(this).toggleClass("selected");
});

我尝试过这样做,但我无法理解其背后的概念。我不想提交表单中的每个值。我只想提交用户选择的值。这样做的唯一方法是在后端解析字符串吗?在我的解决方案@ShobhitLike中,您将如何做到这一点?您如何像在sele中一样一次性提交数组ct?我不想让每次点击事件都触发发送帖子。但我不明白你是如何从列表中选择要在表单中提交的项目的。你的方法不只是将所有用户作为帖子中的选定用户推送进来吗?不,它使用与你选择项目完全相同的方法。我只是设置hi,而不是设置值dden字段作为一个整体。试一试,它对我很有用。但是将它添加到div做什么呢?如何提交我在表单中选择的项目?
{"utf8"=>"✓",
 "authenticity_token"=>"redacted",
 "groupchat"=>{"topic"   =>"5dd",
               "user_ids"=>["5,6,7,8"]},
 "commit"=>"Done"}
<input value="1" multiple="multiple" type="hidden" name="groupchat[user_ids][]">
<input value="2" multiple="multiple" type="hidden" name="groupchat[user_ids][]">
<input value="3" multiple="multiple" type="hidden" name="groupchat[user_ids][]">
<div id="hidden-fields" style="display: none;"></div>
<ul id="special-select">
  <% User.where.not(id: current_user.id).each do |user| %>
    <li class="groupmember-select" id=<%= user.id %> value=<%= user.id %> data-hidden-field-tag="<%= html_escape_once f.hidden_field(:user_ids, { multiple: true, value: user.id }) %>" >
      <%= user.identity %>
    </li>
  <% end %>
</ul>
var selectedUsers = [];
$("#special-select li").click(function(){
  var index = selectedUsers.indexOf($(this).attr("data-hidden-field-tag"));
  if (index > -1) {
    selectedUsers.splice(index, 1);
  }
  else {
    selectedUsers.push($(this).attr("data-hidden-field-tag"));
  }
  $("#hidden-fields").html(selectedUsers);
  $(this).toggleClass("selected");
});