如何在模型

时间:2015-07-18 19:08:29

标签: ruby-on-rails ruby

我有一个简单的冒充应用程序。如何从它的模型中获取帖子网址并将其传递给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

2 个答案:

答案 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。