Я не пробовал и не проверял это, но я думаю, вы можете сделать что-то вроде:
def share_all
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(title, content, post_url(self, :host => "your_host"))
end
end
До этого в вашей модели добавьте:
include ActionController::UrlWriter
Это также сделает помощника по URL доступным в вашей модели. Вы можете прочитать this , чтобы получить больше информации об этом.
Пожалуйста, попробуйте это тоже (нашел на эта страница снова):
Rails.application.routes.url_helpers.post_url(self, :host => "your_host")
[EDIT]
Я только что прочитал вашу суть , что вы должны сделать, это вместо этого:
## posts.rb
after_commit :share_all
def share_all
# note that I am using self inside the method not outside it.
url = Rails.application.routes.url_helpers.post_url(self, :host => "localhost:3000")
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(url)
end
end
Или:
include ActionController::UrlWriter #very important if you use post_url(..) directly
after_commit :share_all
def share_all
# if you use the url helper directly you need to include ActionController::UrlWriter
url = post_url(self, :host => "localhost:3000")
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(url)
end
end
очень очень важно, чтобы вы получили этот URL внутри метода share_all , а не вне его, потому что self не имеет одинакового значения, будь то внутри или снаружи. Когда он находится внутри метода, self ссылается на экземпляр Post, для которого вызывается метод share_all. Когда он снаружи, это сам класс Post.
Я проверил эти два варианта, и они отлично работают:).