【问题标题】:How do you create HTML files using Ruby Dynamically?如何使用 Ruby 动态创建 HTML 文件?
【发布时间】:2021-03-07 10:27:10
【问题描述】:

问题说明

我有一个逻辑(我的视图文件中的 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

【问题讨论】:

    标签: ruby-on-rails helper


    【解决方案1】:

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

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

    在文件中,您可以将 ruby​​ 与 &lt;% %&gt; 一起使用,并使用 &lt;%= %&gt; 打印 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'),但我经常使用它,因此值得使用一个助手。

    【讨论】:

    • 嗨@sam,感谢您的反馈。我知道嵌入式 ruby​​ 文件(简称 ERB)。按照惯例,视图文件中不应使用任何逻辑(即 .html.erb 文件,所有这些都应该移至 Helper 文件。我确实设法解决了这个问题。如果您对细节感兴趣,请点击我的源代码所在的链接:github.com/SarvarKh/Private-Events-practice/blob/events/app/…
    【解决方案2】:

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


    基本上,它只返回嵌套的 :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 => "m-1" do
                content_tag :div, :class => "border border-secondary p-2 m-3" do
                    content_tag(:h6, "Previously attended event:")
                    content_tag(:p, event.description)
                    content_tag(:p, event.date)
                end
            end
        end
    end
    

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

    更新

    你可以按如下方式使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2011-06-13
      相关资源
      最近更新 更多