2011-09-11 30 views
0

我開始一個項目,並計劃使用en.yml文件保持字符串分離。我保持由控制器和行動,即組織的字符串:Rails - 如何在調用「render」時確定原始控制器和操作?

en: 
    users: 
    new: 
     title:      "Sign up" 
     email_label:     "E-mail address:" 
     password_label:    "Password:" 
     password_confirmation_label: "Password confirmation:" 
     submit:      "Sign up" 

我希望寫的作品在哪裏它正在從這樣我可以只是調用s("email_label")而不是t("users.new.email_label")稱爲方法:

def s(str, locals{}) 
    t("#{params[:controller]}.#{params[:action]}.#{str}", locals) 
end 

這對於用戶/新頁面非常有用,但是在處理「創建」操作時,如果它失敗,它會在內部調用render 'new'。重新呈現的頁面然後將在'users.create'中而不是'users.new'中查找字符串。

有沒有辦法解決這個問題,而不覆蓋params [:action]的值,或者在每個視圖的頂部手動設置變量?

在此先感謝

+0

如果您希望通過控制器/操作來確定您的CSS範圍,則會出現同樣的煩惱。我希望有人有一個答案! – cailinanne

回答

1

不是答案原來的問題,但也許是一個選擇嗎?

爲什麼不只是有:new_title:edit_title,等等,則顯式調用他們的翻譯?

這樣做可能是不正確的,正如您遇到的問題所證明的那樣。你不是在尋找基於行動的翻譯,而是真的通過模板。即使這可能是情境。另外,是否還會有模板翻譯爲updatecreate?可能不會,因爲他們不呈現模板(您的問題)。

另外,如果你以後想要一個表單在不同的頁面上創建記錄呢?例如。由帖子控制器處理的「帖子」頁面上的「新評論」表格。事情會變得毛茸茸的。

看起來您可以通過爲您知道存在的密鑰提供翻譯並明確調用它們來獲得更多控制權。

# translations 
en: 
    users: 
    new_title: Sign Up 
    edit_title: Edit User 
    index_title: Users 

# new.html.erb (and so on) 
<%= title s(:new_title) %> 
... 

# controller helper method 
def s(key, locals = {}) 
    I18n.t key, locals.merge(:scope => controller_name) 
end 

此外,您可能已經知道這一點,但標籤傭工在使用模式轉換,這可能有助於避免重複定義國際化出爐。這些也將是用於生成錯誤中的屬性名稱的翻譯。例如。

en: 
    attributes: 
    # globally defined attribute translations 
    password: Password 

    activerecord: 
    attributes: 
     user: 
     # per model overrides 
     password: User Password 

# The label helpers then use these (this label would translate to "User Password") 
= form_for(@user) do |f| 
    = f.label :password 

根據記錄是否持久存在,還有按鈕助手的動態翻譯。取決於您如何處理註冊,這可能會或可能不會乾淨利落地開箱即用。如果你的註冊只是創建用戶,它應該。

en: 
    helpers: 
    user: 
     create: "Sign Up Now!" 
     update: "Update User!" 

# This label would translate to "Sign Up Now!" 
= form_for(User.new) do |f| 
    = f.submit 
相關問題