【问题标题】:Is it possible to create dynamic label name for nested attributes created by cocoon gem?是否可以为 cocoon gem 创建的嵌套属性创建动态标签名称?
【发布时间】:2018-03-16 18:23:10
【问题描述】:

我使用 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' %>

【问题讨论】:

    标签: ruby-on-rails cocoon-gem


    【解决方案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)。 注意有 cmets 说这行不通,因为对象没有顺序。您应该对其进行测试,或者选择其他实现(您可以在同一链接中找到类似的解决方案)。

    $(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++;
      });
    
    });
    

    【讨论】:

    • 是的,很好的答案!在回调中我认为你应该切换两行:首先确定next_label,然后使用它。
    • 好吧。这取决于表单是否以至少一个选项开头。我认为没有选择,所以 A wood 是第一个使用的标签。我将要使用的标签存储在 next_label 中,因此在使用后将其递增。
    • 抱歉,我忽略了 next_label 是全局定义的。
    • 您好,感谢您的回复。另一个快速的问题,如果我想使用罗马数字作为标签名称怎么办? @巴勃罗
    • @Pablo,我尝试了你的建议。附加标签名称时更改。但是,标签名称无法正常工作。例如,第一个标签名称是 II,随后的标签名称是 IV。知道是什么原因造成的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2011-11-29
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多