Rails常用字符串(用于通知和错误消息等)

时间:2011-06-20 12:24:03

标签: ruby-on-rails ruby

大约一年前,我决定确保每个包含非独特文本的Flash通知都会从模块中的方法获取文本。我这样做的最初原因是为了避免反复输入相同的字符串。如果我想改变措辞,我可以在一个地方轻松地做到这一点,并且错综复杂地反复重复相同的事情的可能性会降低。

我最终得到的是:

module Messages
    def format_error_messages(errors)
        errors.map {|attribute, message| "Error: #{attribute.to_s.titleize} #{message}.<br />"}
    end

    def error_message_could_not_find(object_name)
        "Error: Unable to find the specified " + object_name + "!"
    end

    def error_message_could_not_create(object_name)
        "Error: Unable to create the " + object_name + "!"
    end

    def error_message_could_not_save(object_name)
        "Error: Unable to save " + object_name + " to database!"
    end

    def error_message_could_not_update(object_name)
        "Error: Unable to update " + object_name + "!"
    end

    def error_message_could_not_destory(object_name)
        "Error: Unable to destroy " + object_name + "!"
    end

    def notice_message_created(object_name)
        object_name.capitalize + " has been created!"
    end

    def notice_message_updated(object_name)
        object_name.capitalize + " has been updated!"
    end

    def notice_message_destroyed(object_name)
        object_name.capitalize + " has been deleted!"
    end
end

在我设置闪光灯的控制器中,我可以执行以下操作:

flash[:notice] = notice_message_created("post")

这样,所有成功创建的对象都会生成类似的消息。

我现在正在重做我的一个项目并且正在完成所有这些并且我有这种唠叨的感觉,这不是最好的方法来做这件事。我的意思是,它有效,到目前为止它对我有好处,但我从未见过其他人这样做,我开始认为这是有原因的。每次我需要一个新字符串时都必须添加一个新方法,这看起来几乎是愚蠢的。但那么我怎样才能将上下文文本插入到字符串中(就像我们正在处理的对象类型的名称一样)?

在处理常见的文本字符串时是否有Rails社区标准?特别是那些需要在运行时插入其他文本的文件?

我一直在阅读Rails的国际化,因为将我的项目本地化为多种语言会很好,我喜欢将所有文本字符串放在漂亮的YAML文件中,这样可以杀死两只鸟一块石头。但我不知道我怎么能做到这一点,并保持我已经拥有和需要的相同功能(除非我非常错误,我不需要它,因为有更好的方法)。

我对这个问题的任何想法,建议或相关阅读都很开放。

2 个答案:

答案 0 :(得分:5)

您可以使用Rails Internationalization API作为替代方法。然后,您可以使用要使用的字符串填充您的语言环境文件。您可以包含您想要提供的任何参数,如教程中的示例ins部分4.2所示。

I18n.backend.store_translations :en, :thanks => 'Thanks %{name}!'
I18n.translate :thanks, :name => 'Jeremy'
# => 'Thanks Jeremy!'

请执行以下步骤:

  1. 访问文件config/locales/en.yml

  2. 插入您的本地化:

    EN:   创建:“#{name}已创建!”

  3. 拨打以下notice_message_created(object_name)以下内容:t(:created, object_name.capitalize)

  4. 最后,一切都应该像以前一样工作,你已经摆脱了很多简单的方法,并且你可以通过包含语言环境和将语言环境文件添加到config/locales来使应用程序国际化。

答案 1 :(得分:3)

我肯定会选择I18N。但是,它需要一些努力,比如查找需要翻译的所有字符串,并且主要是为您的翻译文件提供一个良好的结构。

Rails I18N支持interpolation,因此如果您需要在字符串中插入一个不会有问题的数字或名称。

或者我是否误解了“相同功能”的含义?