是否可以为cocoon gem创建的嵌套属性创建动态标签名称?

时间:2018-03-16 18:23:10

标签: ruby-on-rails cocoon-gem

我使用cocoon gem创建了一个带有嵌套属性的表单。单击link_to_add_association时,它将附加标签和text_field。但是,我希望标签名称是动态的,因为每个标签的标签名称都不同。例如,我想要' A:'作为第一个标签的标签名称,' B:'对于第二个标签,依此类推。是否有可能实现这一目标?

/ _ mcq.html.erb

<%= f.fields_for :mcq_options do |option| %>
  <%= render 'question_paper_generations/mcq_option_fields', f: option %>
<% end %>

<div><%= link_to_add_association 'Add Option', f, :mcq_options %></div>

/ _ mcq_options_fields.html.erb

<%= f.label :option %>
<%= f.text_field :option, class: 'form-control' %>

1 个答案:

答案 0 :(得分:1)

假设您的嵌套字段位于div“#options”

$(document).ready(function() {

  var next_label = "A";

  def next_char(c) {
    next = "A";
    if (c != "Z") {
      next = String.fromCharCode(next.charCodeAt(0) + 1);
    };
    return next;
  };

  $('#options').on('cocoon:after-insert', function(e, added_option) {
    added_option.find("label").first().text(next_label+":");
    next_label = next_char(next_label);
  });

});

修改

使用罗马数字:(取自:https://stackoverflow.com/a/32851198/3372172)。 注意即可。 有评论说这不起作用,因为对象没有订单。您应该测试它,或选择其他实现(您可以在同一链接中找到类似的解决方案)。

$(document).ready(function() {

  var next_label = 1;

  function romanize(num) {
    var lookup = { M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1};
    var roman = '';
    var i;
    for ( i in lookup ) {
      while ( num >= lookup[i] ) {
        roman += i;
        num -= lookup[i];
      }
    }
    return roman;
  };

  $('#options').on('cocoon:after-insert', function(e, added_option) {
    added_option.find("label").first().text(romanize(next_label)+":");
    next_label++;
  });

});