2015-08-21 31 views
0

我有以下代碼:如何根據模型調用resource_url中的資源?

def perform(message, slug) 
    url = Bitly.client.shorten(post_url(slug)).short_url 
    tweet("#{message} #{url}") 
    end 

可以說,我也有一個模型(上面的代碼是Post模型)。如果我想要得到一個圖書的URL我使用以下幫助book_url(slug)

如何將post_url更改爲book_url,取決於執行被調用的模型?

所以,如果從Book模型調用該方法,我有book_path如果來自Post模型,我有post_path。

回答

1

您可以使用send()方法動態調用這些助手或模式函數。該方法來自Ruby,以下是更多信息。 http://apidock.com/ruby/Object/send

在你的情況,你就去做這樣的:

model_name = object.class.to_s.underscore 
send("#{model_name}_path", slug) 

編輯 爲你的代碼可能是

send("#{model_name}_url", slug, host: ActionMailer::Base.default_url_options[:host]) 

我想爲你在我的控制檯:

include Rails.application.routes.url_helpers 
model_name = User.first.class.to_s.underscore 
=> "user" 
send("#{model_name}_path", User.first.cached_slug) 
=> "/community/user/hummel" 
send("#{model_name}_path", User.first.id) 
=> "/community/user/1" 

作爲請求,你要發送一個主機到該方法

使用_url,而不是_path幫手,也給額外的PARAM host到方法。

send("#{model_name}_url", User.first.cached_slug, host: "google.com") 
=>http://google.com/community/user/hummel 
+0

我試圖做同樣的事情「# {model_name} _url「,但沒有奏效。您的解決方案可行,但我如何將主機添加到此代碼? post_url(slug,host:ActionMailer :: Base.default_url_options [:host]) – kirqe

1

如果您使用Rails的標準途徑,如:resources :books 你可以做到以下幾點:

def perform(message, resource) 
    url = Bitly.client.shorten(url_for(resource)).short_url 
    tweet("#{message} #{url}") 
end 

欲瞭解更多信息,請閱讀url_for

+0

嘿,我剛剛測試過它,但沒有'url_for','Bitly.client.shorten(resource)',它工作。 – kirqe

相關問題