如何在div标签的id属性中添加Rails代码?

时间:2019-01-02 20:51:09

标签: ruby-on-rails ruby bootstrap-4

我想做这样的事情:<div id="<%=service.name%>"

但是,我只是无法正常工作。我需要帮助!我正在尝试为每个单击的按钮创建一个模式,但仅在html.erb中的模式div上创建。

要使模式起作用,它们必须具有相同的ID。

<% @services.each do |service| %>

<div class="card">
<a class="card-b" href="#" data-toggle="modal" data-target="# <%=service.name%> ">
</div>

<div class="modal" id=" <%=service.name%> " tabindex="-1" role="dialog" aria-hidden="true">
Hello this is the modal.
</div>

<% end %>

我想在ID标签中使用Rails代码,我不知道是否可行?

编辑:

我尝试了最好的答案,但它仅适用于某些模态,而其余的则无效。然后,我在表中添加了modal_tag列,所有模式都起作用。谢谢!

我的代码现在为id="<%=service.modal_tag%>

3 个答案:

答案 0 :(得分:4)

我更喜欢使用SecureRandom.hex所指出的唯一值,例如__id__engineersmnky,而不是使用模型ID。代码看起来像这样:

# You may also have to require 'securerandom' within your rails app 
# (can't remember if that comes in automatically or not)
<% @services.each do |service| %>
  <!-- Either option for random_id works below -->
  <% random_id = SecureRandom.hex %> 
  <% random_id = service.__id__ %>

  <div class="card">
    <a class="card-b" href="#" data-toggle="modal" data-target="#<%= random_id %>">
  </div>

  <div class="modal" id="<%= random_id %>" tabindex="-1" role="dialog" aria-  hidden="true">
    Hello this is the modal.
  </div>
<% end %>

我之所以喜欢这样做,是因为它不会泄漏数据库ID(如果您对此很在意),并且如果将此模式嵌入其他页面中,则ID冲突的可能性就较小。


给定一个简单的基准测试脚本,看起来__id__是两个选项中性能最高的:

$ cat unique_id.test.rb
require 'securerandom'
require 'benchmark'

n = 100_000
Benchmark.bm do |x|
  x.report { n.times do |n|  ; SecureRandom.hex; end }
  x.report { n.times do |n|  ; n.__id__ ; end }
end

$ ruby unique_id.test.rb
   user     system      total        real
   0.180000   0.000000   0.180000 (  0.176293)
   0.000000   0.000000   0.000000 (  0.005554)

答案 1 :(得分:3)

Ruby on Rails具有一个dom_id method,可以生成用于HTML文档中的唯一ID。此外,我不喜欢将HTML标签和ERB混合使用-因此,我可能会使用辅助方法

# in a helper
def service_modal(service, &block)
  tag.div(class: 'card') do
    tag.a(class: 'card-b', data: {toggle: 'modal', target: dom_id(service) }, href: '#')
  end +

  tag.div(class: 'modal', dom_id(service), tabindex: 1, role: 'dialog', 'aria-hidden': 'true') do
    capture(&block)
  end
end

并像这样使用它

# in the view
<% @services.each do |service| %>
  <%= service_modal(service) do %>
    Hello this is the modal.
  <% end %>
<% end %>

答案 2 :(得分:0)

此外,您可以使用object_id

路轨:data-target="#<%= service.object_id %>">

基准:

   user     system      total        real
0.071505   0.000187   0.071692 (  0.072017) #SecureRandom.hex
0.004685   0.000016   0.004701 (  0.004727) #__id__
0.004500   0.000001   0.004501 (  0.004503) #object_id