2012-10-26 41 views
4

我有一個包含幾個不同鏈接的ActionMailer的視圖。我運行它在localhost:3000,現在,所以我設置爲這樣的文件在app /初始化稱爲setup_mail.rb(指示here):url_for未使用default_url_options [:host]值

ActionMailer::Base.default_url_options[:host] = "localhost:3000" 

當我去使用url_for在這個觀點,它似乎並沒有拉這個價值。如果我然後將:host => "localhost:3000"添加到每個url_for標記,它們都可以正常工作。但是如果沒有包括在內,它們就無法運作

我還有一個標籤,project_url,這是因爲它出現:一個鏈接到指定的項目。這起作用,包括主機值,只有project_url(@project)。爲什麼一個人會工作,而不是另一個?

從我讀過的所有內容中,在初始值設定中設置default_url_options[:host]應該允許我省略url_for標記中的:host值。顯然,增加價值並不是世界上最糟糕的事情,但似乎沒有必要,這意味着當我最終將項目託管到某個地方時,我將不得不經歷並改變整個地方的價值。但更糟糕的是,這是我不明白的。我仍然在學習,所以我想知道我做錯了什麼。

回答

3

The documentation是這個

很清楚當你決定設置默認:主機爲您的郵件程序,那麼你需要確保使用:使用url_for時only_path => false選項。由於當未顯式提供:host選項時,url_for視圖幫助程序默認會生成相對URL,傳遞:only_path => false將確保生成絕對URL。

你可以創建自己的幫手,而不是使用url_for的強制:only_pathfalse

def your_url_for(options = {}) 
    options.reverse_merge! only_path: false 
    url_for(options) 
end 

你也猴子補丁軌道,迫使這是默認的,但剩下的給你:)

這一切都將是除了加入

config.action_mailer.default_url_options = { host: "YOUR HOST" } 

config/application.rb或同等學歷。

+1

所以我在這裏收集的是我無法真正避免額外的參數 - 我可以避免多次複製主機。但是很少弄亂這個方法,或者創建一個新的方法,我將不得不在每個'url_for'標籤中使用':host'或':only_path'。儘管這不適用於像'project_path'這樣的東西?這太糟糕了。 –

+0

如果您像我描述的那樣創建自己的助手,或者使用猴子補丁'url_for'來重載默認':only_path'選項,並選擇直接使用'url_for',那看起來是正確的。在我的應用程序中,我很少需要'url_for',所以它從來都不是我真正關心的問題。 – deefour

2

看來:only_path選項是錯誤的,這是默認情況下。所以您需要明確地爲每個標籤提供[:host]或爲url_for設置默認選項,這將應用於所有標籤。這裏是如何設置默認主機:

把這個代碼在你的應用程序控制器&它應該工作。

helper_method :url_for 
def default_url_options(options) 
    { host: 'localhost:3000' } 
end 

有關詳情,請set url_for defaults

+0

此代碼看起來陳舊。我在Rails 3.2中。看看評論,這仍然有效,但這仍然是一個理想的解決方案?你說我需要明確提供:每個標籤的主機,但我沒有。正如我上面指出的那樣,'project_url'正確地使用了默認主機。爲什麼像railscasts這樣的網站會提出我在上面使用的方法,而不是你建議的方法? –

+0

你誤會了。 'ActionMailer :: Base.default_url_options [:host]'應該工作&總是爲我工作。但是,在你的情況下,它不。這就是爲什麼我建議嘗試通過default_url_options來設置它,看看它是否有效。因此請嘗試在您的應用控制器中刪除上面的代碼 – CuriousMind

+0

好吧,這樣您就可以將其作爲備份?我很感激。我會記住它。 +1。但我想先弄清楚是什麼導致了這個問題。 –

-2

你設定的ActionMailer :: Base的默認,但似乎期望它重置的ActionController :: Base的默認值。

一個<%=的link_to%>您的郵件視圖內不一定知道的事實,這是一個郵件視圖中任何東西。

+0

我沒有使用'link_to',我正在使用'url_for',這是我見過的任何地方都意味着我應該使用的ActionMailer。我在ActionMailer視圖中使用它,而不是Controller(如果我正確地理解了區別)。 –

1

而是與全球默認設置其恕我直言,篡改應該初始化後不能被改變,你可以簡單地定義一個方法default_url_options在你的郵件,就像你可以在控制器做到這一點:

class UserMailer < ActionMailer::Base 
    def default_url_options 
    { host: Tenant.current(true).host } 
    end 

    def confirm(user) 
    @user = user 
    mail(to: @user.email, subject: t(".subject_confirm")) 
    end 
end