我有一个简单的冒充应用程序。如何从它的模型中获取帖子网址并将其传递给Bitly shortener? (用帖子网址替换http://www.google.com)
这可能就像
Rails.application.routes.url_helpers.posts_path(self...)
-
class TwitterWorker
include Sidekiq::Worker
def perform(title, url)
tweet("#{title} #{url}")
end
end
-
class Post < ActiveRecord::Base
include Tweets
extend FriendlyId
after_create :post_to_twitter
.....
private
def post_to_twitter
title = self.title[0..120]
url = Bitly.client.shorten("http://www.google.com").short_url
TwitterWorker.perform_async(title, url)
end
end
-
我以前在模型中有这个代码
# tweet("#{title[0..120]} #{ Bitly.client.shorten('http://www.google.com').short_url}")
UP 我最终做了以下事情。
由于我有一些可以发帖的模型,我稍微重构了post_to_tweeter meth
工人
class TwitterWorker
include Sidekiq::Worker
include Tweets
include Rails.application.routes.url_helpers
def perform(message, slug)
url = Bitly.client.shorten(post_url(slug, host: ActionMailer::Base.default_url_options[:host])).short_url
tweet("#{message} #{url}")
end
end
模型
after_create :post_to_twitter
def post_to_twitter
message = "#{self.title[0..120]}"
TwitterWorker.perform_async(message, self.slug)
end
答案 0 :(得分:2)
你可以加入网址 模特中的助手(虽然它 通常不是最好的方式 处理事情)
class MyClass < ActiveRecord::Base
include Rails.application.routes. url_helpers
end
答案 1 :(得分:1)
如果您在URL中使用模型ID,则可以使用以下代码。但是,我喜欢使用obfuscate_id和/或friendly_id gems来防止用户知道数据库中有多少条记录。
型号:
class Post < ActiveRecord::Base
...
private
def post_to_twitter
title = self.title[0..120]
TwitterWorker.perform_async(title, self.id)
end
end
Twitter工作人员:
class TwitterWorker
include Sidekiq::Worker
def perform(title, post_id)
tweet("#{title} Bitly.client.shorten(post_url(#{post_id})).short_url)
end
end
如果123是帖子ID,则会将网址设置为http://localhost.com/post/123。
要设置您的网站在登台和制作环境中的位置,请快速阅读 - How does rails 4 generate _url and _path helpers。
P.S。您还可以使用post_url技巧在电子邮件中包含绝对URL。