【问题标题】:gsub method in RubyRuby 中的 gsub 方法
【发布时间】:2014-12-19 19:45:23
【问题描述】:

我是 RoR 新手,我正试图弄清楚如何让 gsub 方法将 html 添加到我的页面。具体来说,我正在尝试一个练习,比如 Twitter,将路由到一个操作,该操作将通过链接用户的用户名来列出用户的推文。因此,内容属性中的字符串@username 将链接到用户推文中的/tweets/username 列表。我已经完成了动作和路线,但我无法让 gsub 正常工作。这是我认为可行的方法

<%= content_tag :p, twet.content.gsub(/@[a-zA-z0-9]/, <html code here>)%>

但事实并非如此。 html 呈现为文本。为了解决这个问题,我还尝试使用 $1 变量创建一个 link_to 辅助方法

<%= content_tag :p, twet.content.gsub(/@[a-zA-z0-9]/, link_to(("#{$1}", user_tweet_path($1)))%>

但这也不起作用。我阅读了其他帖子并了解到由于恶意代码保护,rails 可能无法打印 html,并且在 sub 之后设置了 $1,所以我不知道如何使它工作。

【问题讨论】:

标签: ruby-on-rails ruby gsub


【解决方案1】:

变量twet 在传递给content_tag 之前需要设置为html 安全。试试这个:

<%= content_tag :p, twet.content.gsub(/@[a-zA-z0-9]/, <html code here>).html_safe %>

content_tag 将其输出标记为 HTML 安全,但前提是它已对传递给它的所有内容进行了清理。

【讨论】:

    【解决方案2】:

    这不是您问题的答案,但是,除了您认为不应该这样做之外,您的正则表达式模式存在缺陷:

    /@[a-zA-z0-9]/
    

    考虑它在做什么:

    [*'A'..'z', *'0'..'9'].join[/[a-zA-z0-9]+/]
     => "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz0123456789"
    

    A-z 打开模式抓取从“A”到“z”的所有字符,包括

    [\]^_`
    

    你可能不想要那个。

    这是 an example 在 Rubular.com 上直观地展示它。

    【讨论】:

      【解决方案3】:

      尝试在第一种方法中将.html_safe 添加到 HTML 字符串中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-23
        • 2020-10-16
        • 1970-01-01
        • 2018-08-17
        • 2010-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多