在 Rails 中创建动态属性和 CSS 类

Create dynamic attributes and CSS classes in Rails

我在 Rails(5.2) 的 Ruby 中收到了关于造型的枯燥问题。

1.我想达到的目标

所以我正在为房屋销售创建便利设施 表格 部分,我得到以下信息:

但我正在查看我的代码,老实说这太可怕了!

          <%= form.fields_for :rules do |rules_form| %>
                    <div class="col l4 m2 s4">
                        <label>
                            <div class="input-field">
                                <i class="material-icons-two-tone">pets</i>
                                <%= rules_form.check_box(:pets_allowed, {}) %>
                                <span for="pets_allowed">Pets Allowed</span>
                            </div>
                        </label>
                    </div>

                    <div class="col l4 m2 s4">
                        <label>
                            <div class="input-field">
                                <i class="material-icons-two-tone">smoking_rooms</i>
                                <%= rules_form.check_box(:permitted_smoking, {}) %>
                                <span for="permitted_smoking">Smoking Allowed</span>
                            </div>
                        </label>
                    </div>

                    <div class="col l4 m2 s4">
                        <label>
                            <div class="input-field">
                                <i class="material-icons-two-tone">people</i>
                                <%= rules_form.check_box(:allowed_visitors, {}) %>
                                <span for="allowed_visitors">Vists Allowed</span>
                            </div>
                        </label>
                    </div>

                    and so on.....

2。我想做的事:

所以是的,如您所见,这不是一件枯燥的事情。我想做的是这样的:

   <%= form.fields_for :rules do |rules_form| %>
            <div class="col l4 m2 s4">
                <label>
                    <div class="input-field">
                        <i class="material-icons-two-tone">[dynamic icon]</i>
                        <%= rules_form.check_box([dynamic db column name], {}) %>
                        <span for="pets_allowed">[dynamic text to display]</span>
                    </div>
                </label>
            </div>
   <% end %>

可能这不是语法,但您明白了。

3。到目前为止我做了什么:

好的,这就是我一直想做的事情,1. 在我的帮助程序文件上创建一个类似这样的方法:

def servicesArray
        serv = ['wifi', 'gas', 'water', 'electricity', 'include_furniture', 'air_conditioning', 'business_center', 'laundry', 'television', 'guard']
        serv.each do |obj|
            puts obj
        end
    end

然后为了验证这一点,我在我的 form 上调用它,我看到了这个:

好的,但不是预期的那样,所以我的问题是:

我怎样才能实现这样的目标?处理动态 CSS 类 and/or 属性以避免大量代码块的最佳方法是什么?你建议我将来做什么?

非常感谢您对此的帮助!谢谢

有多种方法可以做到这一点,但从最简单的开始:

  1. 制作一个帮助器,returns 表单所需的所有动态数据。查看您的代码,似乎每个复选框都需要 3 个东西 - 标题、参数名称和全名。所以,你可以像这样写一个辅助方法:

    def services_array
      [
        { title: "pets", param_name: :pets_allowed, full_name: "Pets Allowed" },
        { title: "people", param_name: :allow_visitors, full_name: "Visits Allowed" },
        { title: "smoking_rooms", param_name: :permitted_smoking, full_name: "Smoking Allowed" }
      ]
    end
    
  2. 在你看来,循环这个:

       <%= form.fields_for :rules do |rules_form| %>
         <% services_array.each do |service| %>
           <div class="col l4 m2 s4">
             <label>
               <div class="input-field">
                 <i class="material-icons-two-tone"><%= service[:title] %></i>
                 <%= rules_form.check_box(service[:param_name], {}) %>
                 <span for="<%= service[:param_name] %>"><%= service[:full_name] %></span>
               </div>
             </label>
           </div>
         <% end %>
       <% end %>