【问题标题】:Rails: avoiding loops for modal construction, or dynamic modalsRails:避免模态构造或动态模态的循环
【发布时间】:2025-12-06 04:50:01
【问题描述】:

在我的整个应用程序中,我都有重复的模态代码等代码,就像这样:

<% @documents.each do |d| %>
  <div class="modal hide fade" id="deleteModal<%= d.id %>">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
      <h3 id="deleteModal<%= d.id %>Label">Deleting <%= d.title %></h3>
    </div>
    <div class="modal-body">
      <p>Make sure you want to delete <%= d.title %> before doing so.</p>
    </div>
    <div class="modal-footer">
      <button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
      <%= link_to 'Delete', d, method: :delete, class: "btn btn-danger" %>
    </div>
  </div>
<% end %>

是否有一种设计模式可以鼓励这样的实例使用动态代码?也许是 jQuery 或类似的东西?我觉得非常浪费。还是没那么重要?

【问题讨论】:

  • 你肯定想尽可能地干掉你的代码。无论您发现自己在哪里重复代码,您都应该寻求利用部分、帮助程序和过滤器。

标签: jquery ruby-on-rails ruby-on-rails-3


【解决方案1】:

一种解决方案是使用 TagHelper 编写一个辅助方法(如果模态结构永远不会改变)。更具体地说,通过嵌套 content_tag - http://apidock.com/rails/ActionView/Helpers/TagHelper/content_tag

类似:

modal_helper.rb

module ModalHelper

   def delete_modal(d)
      @id = d.id
      @title = d.title

      content_tag(:div, header + body + footer(d), class: "modal hide fade", id: "deleteModal#{@id}")
   end

   def header
      content_tag(:div, content_tag(:button, "x", class: "close", type:"button", data-dismiss:"modal", aria-hidden:"true") + content_tag(:h3, "Deleting #{@title}", id: "deleteModal#{@id}Label"), class: "modal-header")   
   end

   def body
      content_tag(:div, content_tag(:p, "Make sure you want to delete #{@title} before doing so."), class: "modal-body")    
   end

   def footer(d)
       content_tag(:div, content_tag(:button, "Cancel", class: "btn", data-dismiss:"modal", aria-hidden:"true") + (link_to 'Delete', d, method: :delete, class: "btn btn-danger"), class: "modal-footer")
   end
end

那么简单:

<%= @documents.each {|d| delete_modal(d)} %>

如果您想要不同的信息,当然可以传递您选择的任何参数。

希望这会有所帮助!

【讨论】:

  • 嘿,这是个好主意。干杯!
  • 使用此代码制作的模态实际上不会渲染,仅供参考。
  • 我的错!工作很棒。我的错。
  • 我想说可能需要一些调整,但内容标签返回原始 html,所以如果你可以硬编码它,你可以通过这种方式生成它:)