Rails - 调用'render'时如何确定原始控制器和动作?

时间:2011-09-11 14:34:19

标签: ruby-on-rails ruby

我正在启动一个项目,并计划使用en.yml文件保持字符串分离。我保持由控制器和动作组织的字符串,即:

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]值,或者在每个视图的顶部手动设置变量?

提前致谢

1 个答案:

答案 0 :(得分: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

此外,您可能已经知道这一点,但标签助手已经使用模型翻译进行了i18n烘焙,这可能有助于避免重复定义。这些也将是生成错误中用于属性名称的翻译。 E.g。

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