Rails 4:帮助方法在本地工作,打破Heroku

时间:2015-10-22 22:23:15

标签: ruby-on-rails ruby-on-rails-4 heroku format helper

我有一个带有Post模型的Rails 4应用,其中包含自定义:copy属性。

As recommended here,我在posts_helper.rb中创建了以下方法,以便为:copy的内容中的链接,主题标签和提及添加特定样式:

def link_highlight(string)
    string.gsub!(/((https|http)?:\/\/[\S]+)/, '<span class="highlight">\1</span>')
  end

  def hashtag_highlight(string)
    string.to_s.gsub!(/\S*#(\[[^\]]+\]|\S+)/, '<span class="highlight">#\1</span>')
  end

  def mention_highlight(string)
    string.to_s.gsub!(/\B(\@[a-z0-9_-]+)/i, '<span class="highlight">\1</span>')
  end

  def new_highlight(string)
    link_highlight(string)
    hashtag_highlight(string)
    mention_highlight(string)
  end

然后,在我的Calendars#Show视图中,我显示了:copy属性的内容,我有:

<%= raw new_highlight(post.copy) %>

- - - -

更新:我还尝试将raw方法从视图移动到帮助程序,但仍然得到相同的结果。

- - - -

这完全适用于本地:

enter image description here

但是,只要我部署到Heroku,我应该拥有:copy属性的内容,我什么都没有。

我没有收到任何错误消息。

以下是我的Heroku日志:

2015-10-22T22:14:32.177739+00:00 heroku[slug-compiler]: Slug compilation finished
2015-10-22T22:14:33.045814+00:00 heroku[web.1]: Starting process with command `bundle exec puma -C config/puma.rb`
2015-10-22T22:14:36.100952+00:00 app[web.1]: [3] Puma starting in cluster mode...
2015-10-22T22:14:36.100980+00:00 app[web.1]: [3] * Version 2.13.4 (ruby 2.0.0-p645), codename: A Midsummer Code's Dream
2015-10-22T22:14:36.100981+00:00 app[web.1]: [3] * Min threads: 5, max threads: 5
2015-10-22T22:14:36.100981+00:00 app[web.1]: [3] * Environment: production
2015-10-22T22:14:36.100982+00:00 app[web.1]: [3] * Process workers: 2
2015-10-22T22:14:36.100982+00:00 app[web.1]: [3] * Preloading application
2015-10-22T22:14:37.981682+00:00 heroku[web.1]: Starting process with command `bundle exec puma -C config/puma.rb`
2015-10-22T22:14:39.407860+00:00 app[web.1]: [3] * Listening on tcp://0.0.0.0:52687
2015-10-22T22:14:39.408079+00:00 app[web.1]: [3] Use Ctrl-C to stop
2015-10-22T22:14:39.424709+00:00 app[web.1]: [3] - Worker 0 (pid: 6) booted, phase: 0
2015-10-22T22:14:39.434794+00:00 app[web.1]: [3] - Worker 1 (pid: 11) booted, phase: 0
2015-10-22T22:14:44.770104+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2015-10-22T22:14:46.225951+00:00 app[web.1]: [3] - Gracefully shutting down workers...
2015-10-22T22:14:47.033061+00:00 app[web.1]: [3] === puma shutdown: 2015-10-22 22:14:47 +0000 ===
2015-10-22T22:14:47.033068+00:00 app[web.1]: [3] - Goodbye!
2015-10-22T22:14:48.119725+00:00 heroku[web.1]: Process exited with status 0
2015-10-22T22:15:09.137041+00:00 heroku[web.1]: Starting process with command `bundle exec puma -C config/puma.rb`
2015-10-22T22:15:13.024358+00:00 app[web.1]: [3] Puma starting in cluster mode...
2015-10-22T22:15:13.024410+00:00 app[web.1]: [3] * Version 2.13.4 (ruby 2.0.0-p645), codename: A Midsummer Code's Dream
2015-10-22T22:15:13.024430+00:00 app[web.1]: [3] * Min threads: 5, max threads: 5
2015-10-22T22:15:13.024454+00:00 app[web.1]: [3] * Environment: production
2015-10-22T22:15:13.024479+00:00 app[web.1]: [3] * Process workers: 2
2015-10-22T22:15:13.024502+00:00 app[web.1]: [3] * Preloading application
2015-10-22T22:15:16.803059+00:00 app[web.1]: [3] * Listening on tcp://0.0.0.0:30586
2015-10-22T22:15:16.803071+00:00 app[web.1]: [3] Use Ctrl-C to stop
2015-10-22T22:15:16.818204+00:00 app[web.1]: [3] - Worker 1 (pid: 10) booted, phase: 0
2015-10-22T22:15:16.823176+00:00 app[web.1]: [3] - Worker 0 (pid: 6) booted, phase: 0
2015-10-22T22:15:17.269140+00:00 heroku[web.1]: State changed from starting to up
2015-10-22T22:15:19.171926+00:00 app[web.1]: Started GET "/" for 66.249.88.82 at 2015-10-22 22:15:19 +0000
2015-10-22T22:15:19.325329+00:00 app[web.1]:    (2.9ms)  SELECT COUNT(*) FROM "users"
2015-10-22T22:15:19.342732+00:00 app[web.1]:    (2.8ms)  SELECT COUNT(*) FROM "posts"
2015-10-22T22:15:19.352489+00:00 app[web.1]:   Rendered layouts/_home_header.html.erb (4.9ms)
2015-10-22T22:15:19.357628+00:00 app[web.1]:   Rendered layouts/_cta.html.erb (0.6ms)
2015-10-22T22:15:19.305513+00:00 app[web.1]: Processing by PagesController#home as HTML
2015-10-22T22:15:19.334229+00:00 app[web.1]:    (3.6ms)  SELECT COUNT(*) FROM "calendars"
2015-10-22T22:15:19.345627+00:00 app[web.1]:   Rendered pages/home.html.erb within layouts/homepage (34.5ms)
2015-10-22T22:15:19.355907+00:00 app[web.1]:   Rendered layouts/_footer.html.erb (2.2ms)
2015-10-22T22:15:19.358397+00:00 app[web.1]: Completed 200 OK in 53ms (Views: 31.6ms | ActiveRecord: 18.2ms)
2015-10-22T22:15:19.361256+00:00 heroku[router]: sock=client at=warning code=H27 desc="Client Request Interrupted" method=GET path="/" host=calendy.herokuapp.com request_id=258aefce-534f-4612-b3df-ba4930bca1d9 fwd="24.205.62.204,66.249.88.82" dyno=web.1 connect=0ms service=192ms status=499 bytes=6532
2015-10-22T22:15:20.171154+00:00 app[web.1]: Started GET "/" for 24.205.62.204 at 2015-10-22 22:15:20 +0000
2015-10-22T22:15:20.310024+00:00 app[web.1]: Processing by CalendarsController#index as HTML
2015-10-22T22:15:20.219029+00:00 app[web.1]:   User Load (3.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
2015-10-22T22:15:20.491337+00:00 app[web.1]:   Calendar Load (3.1ms)  SELECT "calendars".* FROM "calendars" INNER JOIN "administrations" ON "calendars"."id" = "administrations"."calendar_id" WHERE "administrations"."user_id" = $1  [["user_id", 1]]
2015-10-22T22:15:20.727624+00:00 app[web.1]:   Comment Load (4.2ms)  SELECT "comments".* FROM "comments" INNER JOIN "posts" ON "comments"."post_id" = "posts"."id" INNER JOIN "calendars" ON "posts"."calendar_id" = "calendars"."id" INNER JOIN "administrations" ON "calendars"."id" = "administrations"."calendar_id" WHERE "administrations"."user_id" = $1 AND ("comments"."user_id" != $2)  ORDER BY created_at DESC  [["user_id", 1], ["user_id", 1]]
2015-10-22T22:15:20.813360+00:00 app[web.1]:   Post Load (2.8ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1  [["id", 39]]
2015-10-22T22:15:20.716275+00:00 app[web.1]:    (5.5ms)  SELECT COUNT(*) FROM "comments" INNER JOIN "posts" ON "comments"."post_id" = "posts"."id" INNER JOIN "calendars" ON "posts"."calendar_id" = "calendars"."id" INNER JOIN "administrations" ON "calendars"."id" = "administrations"."calendar_id" WHERE "administrations"."user_id" = $1 AND ("comments"."user_id" != $2)  [["user_id", 1], ["user_id", 1]]
2015-10-22T22:15:20.907612+00:00 app[web.1]:   Calendar Load (1.3ms)  SELECT  "calendars".* FROM "calendars" WHERE "calendars"."id" = $1 LIMIT 1  [["id", 2]]
2015-10-22T22:15:20.901873+00:00 app[web.1]:   User Load (2.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 2]]
2015-10-22T22:15:20.911719+00:00 app[web.1]:   Post Load (1.3ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1  [["id", 17]]
2015-10-22T22:15:20.916169+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 2]]
2015-10-22T22:15:20.919457+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "calendars".* FROM "calendars" WHERE "calendars"."id" = $1 LIMIT 1  [["id", 3]]
2015-10-22T22:15:20.924117+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 2]]
2015-10-22T22:15:20.922513+00:00 app[web.1]:   Post Load (1.3ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1  [["id", 12]]
2015-10-22T22:15:20.927020+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "calendars".* FROM "calendars" WHERE "calendars"."id" = $1 LIMIT 1  [["id", 3]]
2015-10-22T22:15:20.928461+00:00 app[web.1]:   Rendered calendars/index.html.erb within layouts/calendars (477.2ms)
2015-10-22T22:15:20.936844+00:00 app[web.1]:   Rendered layouts/_app_footer.html.erb (0.6ms)
2015-10-22T22:15:20.939230+00:00 app[web.1]: Completed 200 OK in 627ms (Views: 449.5ms | ActiveRecord: 53.5ms)
2015-10-22T22:15:20.939775+00:00 heroku[router]: at=info method=GET path="/" host=calendy.herokuapp.com request_id=185b8006-2a24-4c46-ab7a-a54dfd28426a fwd="24.205.62.204" dyno=web.1 connect=0ms service=774ms status=200 bytes=6085
2015-10-22T22:15:20.891430+00:00 app[web.1]:   Calendar Load (1.7ms)  SELECT  "calendars".* FROM "calendars" WHERE "calendars"."id" = $1 LIMIT 1  [["id", 3]]
2015-10-22T22:15:20.909413+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 2]]
2015-10-22T22:15:20.905320+00:00 app[web.1]:   Post Load (1.5ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1  [["id", 36]]
2015-10-22T22:15:20.914656+00:00 app[web.1]:   Calendar Load (2.0ms)  SELECT  "calendars".* FROM "calendars" WHERE "calendars"."id" = $1 LIMIT 1  [["id", 4]]
2015-10-22T22:15:20.918590+00:00 app[web.1]:   Post Load (1.4ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1  [["id", 16]]
2015-10-22T22:15:20.933923+00:00 app[web.1]:   Rendered layouts/_app_header.html.erb (3.1ms)
2015-10-22T22:15:20.920311+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 2]]
2015-10-22T22:15:20.926179+00:00 app[web.1]:   Post Load (1.3ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1  [["id", 10]]
2015-10-22T22:15:20.923275+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "calendars".* FROM "calendars" WHERE "calendars"."id" = $1 LIMIT 1  [["id", 3]]
2015-10-22T22:15:20.928028+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 2]]
2015-10-22T22:15:21.126130+00:00 heroku[router]: at=info method=GET path="/assets/application-e8cebe24aff6ef7ad69efb41d7c5711a9989222e399d255e9e837b1d885140d5.css" host=calendy.herokuapp.com request_id=5fd9e6c0-171b-4ce6-a131-0f5373e938f6 fwd="24.205.62.204" dyno=web.1 connect=0ms service=25ms status=304 bytes=93
2015-10-22T22:15:21.224378+00:00 heroku[router]: at=info method=GET path="/assets/application-6ffeee9db4d53ff7b400a1972dc1e2b2a70f00df1f241a15e6f46ebb4a960b08.js" host=calendy.herokuapp.com request_id=ef81fff1-287b-403a-aff1-34169f1d0650 fwd="24.205.62.204" dyno=web.1 connect=0ms service=2ms status=304 bytes=93
2015-10-22T22:15:21.328775+00:00 heroku[router]: at=info method=GET path="/assets/calendy-social-media-calendar-tool-logo-216edd59c104b197d08537c3e1725cc02f70fdb89f5218c6b84ca2677feb32a5.png" host=calendy.herokuapp.com request_id=5cec4773-d7a8-42a4-beac-965e8ae3638a fwd="24.205.62.204" dyno=web.1 connect=0ms service=7ms status=304 bytes=93
2015-10-22T22:15:21.427726+00:00 heroku[router]: at=info method=GET path="/logos/small_thumb/missing.png" host=calendy.herokuapp.com request_id=79728d60-fdbd-4587-8adb-71d8f1146aab fwd="24.205.62.204" dyno=web.1 connect=0ms service=4ms status=200 bytes=1390
2015-10-22T22:15:21.434150+00:00 heroku[router]: at=info method=GET path="/assets/bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2" host=calendy.herokuapp.com request_id=d9f5b809-806b-4ec3-a148-0413ec58b7e7 fwd="24.205.62.204" dyno=web.1 connect=0ms service=18ms status=304 bytes=93
2015-10-22T22:15:21.440134+00:00 heroku[router]: at=info method=GET path="/images/create_new_calendar.png" host=calendy.herokuapp.com request_id=04cd55fd-f830-4993-80c8-02fd7c21e98f fwd="24.205.62.204" dyno=web.1 connect=2ms service=18ms status=200 bytes=1315
2015-10-22T22:15:21.656933+00:00 heroku[router]: at=info method=GET path="/favicon.ico" host=calendy.herokuapp.com request_id=908c6fae-fa39-454c-a947-89a54dbfb8e5 fwd="24.205.62.204" dyno=web.1 connect=12ms service=58ms status=200 bytes=3885
2015-10-22T22:15:29.556393+00:00 app[web.1]: Started GET "/calendars/2" for 24.205.62.204 at 2015-10-22 22:15:29 +0000
2015-10-22T22:15:29.698319+00:00 app[web.1]: Processing by CalendarsController#show as HTML
2015-10-22T22:15:29.698341+00:00 app[web.1]:   Parameters: {"id"=>"2"}
2015-10-22T22:15:29.797049+00:00 app[web.1]:   Calendar Load (3.1ms)  SELECT  "calendars".* FROM "calendars" WHERE "calendars"."id" = $1 LIMIT 1  [["id", 2]]
2015-10-22T22:15:30.377005+00:00 app[web.1]:   User Load (5.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
2015-10-22T22:15:30.689275+00:00 app[web.1]:   Calendar Load (2.4ms)  SELECT  "calendars".* FROM "calendars" INNER JOIN "administrations" ON "calendars"."id" = "administrations"."calendar_id" WHERE "administrations"."user_id" = $1 AND "calendars"."id" = $2 LIMIT 1  [["user_id", 1], ["id", 2]]
2015-10-22T22:15:31.034753+00:00 app[web.1]:    (3.9ms)  SELECT COUNT(*) FROM "posts" WHERE "posts"."calendar_id" = $1 AND (Extract(month from date) = 10) AND (Extract(year from date) = 2015)  [["calendar_id", 2]]
2015-10-22T22:15:31.044658+00:00 app[web.1]:   Post Load (1.9ms)  SELECT "posts".* FROM "posts" WHERE "posts"."calendar_id" = $1 AND (Extract(month from date) = 10) AND (Extract(year from date) = 2015)  ORDER BY date ASC  [["calendar_id", 2]]
2015-10-22T22:15:31.380322+00:00 app[web.1]:   Comment Load (2.5ms)  SELECT "comments".* FROM "comments" WHERE "comments"."post_id" IN (8, 34, 35, 36, 9, 37, 38, 11)
2015-10-22T22:15:31.490695+00:00 app[web.1]:   Administration Load (2.5ms)  SELECT  "administrations".* FROM "administrations" WHERE "administrations"."user_id" = $1 AND "administrations"."calendar_id" = $2 LIMIT 1  [["user_id", 1], ["calendar_id", 2]]
2015-10-22T22:15:32.022820+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "administrations".* FROM "administrations" WHERE "administrations"."user_id" = $1 AND "administrations"."calendar_id" = $2 LIMIT 1  [["user_id", 1], ["calendar_id", 2]]
2015-10-22T22:15:32.046003+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "administrations".* FROM "administrations" WHERE "administrations"."user_id" = $1 AND "administrations"."calendar_id" = $2 LIMIT 1  [["user_id", 1], ["calendar_id", 2]]
2015-10-22T22:15:32.073869+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "administrations".* FROM "administrations" WHERE "administrations"."user_id" = $1 AND "administrations"."calendar_id" = $2 LIMIT 1  [["user_id", 1], ["calendar_id", 2]]
2015-10-22T22:15:32.098074+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "administrations".* FROM "administrations" WHERE "administrations"."user_id" = $1 AND "administrations"."calendar_id" = $2 LIMIT 1  [["user_id", 1], ["calendar_id", 2]]
2015-10-22T22:15:32.137289+00:00 app[web.1]:   Rendered calendars/show.html.erb within layouts/calendars (1294.9ms)
2015-10-22T22:15:32.146407+00:00 app[web.1]:   Rendered layouts/_app_footer.html.erb (1.5ms)
2015-10-22T22:15:32.035637+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "administrations".* FROM "administrations" WHERE "administrations"."user_id" = $1 AND "administrations"."calendar_id" = $2 LIMIT 1  [["user_id", 1], ["calendar_id", 2]]
2015-10-22T22:15:32.065673+00:00 app[web.1]:   User Load (2.8ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 2]]
2015-10-22T22:15:32.084310+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "administrations".* FROM "administrations" WHERE "administrations"."user_id" = $1 AND "administrations"."calendar_id" = $2 LIMIT 1  [["user_id", 1], ["calendar_id", 2]]
2015-10-22T22:15:32.116082+00:00 app[web.1]:   CACHE (0.0ms)  SELECT  "administrations".* FROM "administrations" WHERE "administrations"."user_id" = $1 AND "administrations"."calendar_id" = $2 LIMIT 1  [["user_id", 1], ["calendar_id", 2]]
2015-10-22T22:15:32.143435+00:00 app[web.1]:   Rendered layouts/_app_header.html.erb (4.1ms)
2015-10-22T22:15:32.147188+00:00 app[web.1]: Completed 200 OK in 2449ms (Views: 1344.0ms | ActiveRecord: 144.9ms)
2015-10-22T22:15:32.159294+00:00 heroku[router]: at=info method=GET path="/calendars/2" host=calendy.herokuapp.com request_id=34fe86a2-9114-4f39-b90a-91b787a4df4a fwd="24.205.62.204" dyno=web.1 connect=1ms service=2616ms status=200 bytes=37572
2015-10-22T22:15:32.489404+00:00 heroku[router]: at=info method=GET path="/assets/font-awesome/fontawesome-webfont-3c4a1bb7ce3234407184f0d80cc4dec075e4ad616b44dcc5778e1cfb1bc24019.woff2" host=calendy.herokuapp.com request_id=510f9bf5-29de-4ad6-b02d-4c937edbe1a1 fwd="24.205.62.204" dyno=web.1 connect=0ms service=44ms status=304 bytes=93

- - - -

更新2

好的,所以我一直在玩代码并发现了三件事:

  1. 该代码适用于在实现该方法后创建的帖子,即:在显示推送到Heroku之前创建的帖子中没有post.copy,无论post.copy <内部是什么/ p>

  2. 一旦我们实现了该方法,只有post.copy包含我们正在使用正则表达式查找的元素之一时才会显示http,即:#@exec("ffmpeg -i inputfile.mp3 -b:a 64k outputfile.mp3") 。这有什么意义吗?

  3. 以上所有内容实际上也发生在本地,与我最初观察到的不同。

  4. - - - -

    知道这里出了什么问题吗?

2 个答案:

答案 0 :(得分:0)

我找到了问题的根本原因。

我在终端启动了IRB并进行了一些测试:

h = "hello"
h.gsub!(/((https|http)?:\/\/[\S]+)/, '<span class="highlight">\1</span>')
# => nil

l = "http://www.link.com"
l.gsub!(/((https|http)?:\/\/[\S]+)/, '<span class="highlight">\1</span>')
# => "<span class=\"highlight\">http://www.link.com</span>"

当我试图突出显示的字符串 DOES NOT 包含我们正在寻找的正则表达式的任何模式时,问题实际发生。

要解决此问题,我必须将.gsub!替换为.gsub,并实现条件语句,以便该方法在未检测到模式时返回初始字符串,而不是nil。

这是我的新posts_helper.rb

module PostsHelper

  def link_highlight(string)
    init1 = string
    result1 = string.to_s.gsub!(/((https|http)?:\/\/[\S]+)/, '<span class="highlight">\1</span>')
    if result1.nil?
      init1
    else
      result1
    end
  end

  def hashtag_highlight(string)
    init2 = string
    result2 = string.to_s.gsub!(/\S*#(\[[^\]]+\]|\S+)/, '<span class="highlight">#\1</span>')
    if result2.nil?
      init2
    else
      result2
    end
  end

  def mention_highlight(string)
    init3 = string
    result3 = string.to_s.gsub(/\B(\@[a-z0-9_-]+)/i, '<span class="highlight">\1</span>')
    if result3.nil?
      init3
    else
      result3
    end
  end

  def new_highlight(string)
    link_highlight(string)
    hashtag_highlight(string)
    mention_highlight(string)
  end

end

这可能不是最干净/最精简的代码,但它在本地和远程都有效 - 它允许我在new_highlight最终方法中链接所有三种方法。

答案 1 :(得分:0)

gsub!在未进行任何更改时返回nil,因此您有两种方法。

您可以将帮助程序保留原样,但将最后一个更改为

def new_highlight(string)
  link_highlight(string)
  hashtag_highlight(string)
  mention_highlight(string)
  string
end

就我个人而言,我不喜欢这样,因为我不希望视图助手修改其论点。像这样意外地更改数据库中的数据并不困难。

或者将各种方法更改为

def link_highlight(string)
  string.gsub(...)
end

将最终助手改为

def new_highlight(string)
  mention_highlight(
    hashtag_highlight(
      link_highlight(string)
    )
  )
end

如果您愿意,可以通过多种方式重写最后一个,例如

%i(link_highlight hashtag_highlight mention_highlight).inject(string) do |value, transform|
  public_send(transform, value)
end

虽然我不认为我会为这样一个简单的案例而烦恼(虽然它确实让我想要elixir&#39的管道运营商)