我正在尝试为某些模型创建一个before_save回调,这些模型会将链接和格式添加到文本中并保存在特殊字段中。它不会让我在回调中包含URL帮助程序。
这是我的代码:
module SocialText
extend ActiveSupport::Concern
included do
before_save :action_before_save
end
def action_before_save
self.body_formatted = htmlizeBody(self.body)
end
def htmlizeBody(body)
include Rails.application.routes.url_helpers
include ActionView::Helpers
#replace all \ns with <br>
body = body.gsub(/\n/, ' <br/> ')
words = body.split(/\s/)
words.map! do |word|
if word.first == '@'
username = extractUsernameFromAtSyntax word
user = User.find_by! username: username
if not user.nil?
link_to(word, profile_path(user.username))
else
word
end
else
word
end
end
words.join " "
end
def extractUsernameFromAtSyntax(username)
matchData = username.match(/@(\w+)(['.,]\w*)?/)
if not matchData.nil?
matchData[1]
else
username
end
end
end
我得到了:
NoMethodError (undefined method `include`)
我如何获得帮助?有更好的方法吗?
答案 0 :(得分:0)
include
对类实例对象进行操作,并将其称为实例方法。
您应该在方法之外使用include
部分。
考虑在您的模块范围内使用require
。
答案 1 :(得分:0)
在htmlizeBody
函数中:
include Rails.application.routes.url_helpers
include ActionView::Helpers
这是在错误的范围内,将其移至extend ActiveSupport::Concern
下方将解决您的错误。
您可以问自己的另一个问题是您需要在关注级别使用视图助手?
修改默认URL主机选项时通常会使用 include Rails.application.routes.url_helpers
(通常在需要与外部API接口时)。在这种情况下,在/lib
目录中使用它是有意义的。
有关详细信息,请参阅this SO post和this post on using url helpers