微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Ruby 动态创建 HTML 文件?

如何解决如何使用 Ruby 动态创建 HTML 文件?

问题说明

我有一个逻辑(在我的视图文件中的 if 语句),我会将它移到帮助程序中。我发现有一种方法可以将 ruby​​ 文件中的代码转换为纯 HTML,如下所示:

fileHtml.puts "<h6> Upcoming event: </h6>"

这仅适用于静态代码。如果我有一个数组并循环遍历它会怎样?

示例

module UsersHelper
def check_upcoming_event(event)
    <% if event.date > Time.Now %>
        <div class="m-1">
            <div class="border border-secondary p-2 m-3">
                <h6> Upcoming event: </h6>
                <p><strong>Event Description:</strong> <%= event.description %></p>
                <p><strong>Event Start Date and Time:</strong> <%= event.date %></p>
            </div>
        </div>
    <% else %>
        <div class="m-1">
            <div class="border border-secondary p-2 m-3">
                <h6> PrevIoUsly attended event: </h6>
                <p><strong>Event Description:</strong> <%= event.description %></p>
                <p><strong>Event Start Date and Time:</strong> <%= event.date %></p>
            </div>
        </div>
    <% end %>
end

结束

现在,我如何将数组的元素应用到 HTML 中,这是如何完成的?

fileHtml.puts "<p><strong>Event Description:</strong>" event.description fileHtml.puts "</p>"

我试图这样做,但它给出了错误

module UsersHelper
def check_upcoming_event(event)
    if event.date > Time.Now
        fileHtml.puts "<p><strong>Event Description:</strong>" event.description fileHtml.puts "</p>"        
    end
end
end

enter image description here

解决方法

我找到了一些东西,但不是我想要的。


基本上,它只返回嵌套 :div 中的最后一个字符串

module UsersHelper
def check_upcoming_event(event)
    if event.date > Time.now
        content_tag :div,:class => "m-1" do
            content_tag :div,:class => "border border-secondary p-2 m-3" do
                tag.h6 "Upcoming event:"
                content_tag(:p,event.description)
                content_tag(:p,event.date)
            end
        end
    else
        content_tag :div,:class => "border border-secondary p-2 m-3" do
                content_tag(:h6,"Previously attended event:")
                content_tag(:p,event.date)
            end
        end
    end
end

有关使用 content_tag 在 Ruby 文件中创建 HTML 代码的详细指南,请访问此 link

Snapshot

更新

您可以按如下方式使用 concat,但请注意只能与带括号的 content_tag 一起使用:

            concat(content_tag(:div,class: "col-md-2") do
                if opinion.author.photo.attached?
                    tag("img",src: url_for(opinion.author.photo),class: ["img-80","rounded"])
                end
            end)
            concat(content_tag(:div,class: "col-md-10") do
                # another set of code block
            end)
,

您将 ruby​​ 放入视图以创建动态生成的 HTML。您可以在其中放置循环、if 语句和任何 ruby​​ 代码。

将文件命名为 <action>.html.erb,其中 <action> 是控制器操作的名称(即 index.html.erb)。

在文件中,您可以将 ruby​​ 与 <% %> 一起使用,并使用 <%= %> 打印 ruby​​。

这是一个 if 语句:

<% if event.date > Time.now %>
  <div class="m-1">
    <div class="border border-secondary p-2 m-3">
      <h6> Upcoming event: </h6>
      <p><strong>Event Description:</strong> <%= event.description %></p>
      <p><strong>Event Start Date and Time:</strong> <%= event.date %></p>
    </div>
  </div>
<% else %>
  <div class="m-1">
    <div class="border border-secondary p-2 m-3">
      <h6> Previously attended event: </h6>
      <p><strong>Event Description:</strong> <%= event.description %></p>
      <p><strong>Event Start Date and Time:</strong> <%= event.date %></p>
    </div>
  </div>
<% end %>

这是一个循环:

<% events.each do |event| %>
  <% if event.date > Time.now %>
    ...
  <% else %>
    ...
  <% end %>
<% end %>

您通常应该为较小的代码保留帮助程序。例如,我通常包含一个名为 amer_date 的帮助程序,它接受一个 ruby​​ Date 对象并将其转换为格式为 3/7/2020 的字符串。这是一行代码 date.strftime('%-m/%-d/%Y'),但我经常使用它,因此值得使用帮助程序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。