gpt4 book ai didi

internationalization - Rails 3 View 中的 i18n Markdown 文件

转载 作者:行者123 更新时间:2023-12-02 11:04:29 25 4
gpt4 key购买 nike

我目前正在研究 Michael Hartl 的 Rails Tutorial同时尝试书中未涵盖的其他一些内容。完成后Chapter 5在创建静态页面的地方,我决定将 View 代码更改为 HAML,国际化页面,并将静态内容放入单独的(非部分)Markdown 文件中,使用 RDiscount gem 来渲染它们。例如:

app/views/static_pages/about.html.haml

- provide(:title, t('.about_us'))
:markdown
#{render file: "static_pages/about.#{params[:locale]}.md"}

static_pages 目录下,我有 Markdown 文件,例如 about.en.mdabout.it.mdabout .ja.md 等,因此在 :locale 参数中进行插值决定了渲染哪种语言的 Markdown 文件。

我的问题是:

  1. static_pages 目录中充满了 Markdown 文件,因此是否有任何合理的默认/最佳实践位置(可能在 app 目录之外)来保存这些 Markdown文件,这些文件可能可以由不需要了解应用程序内部工作原理的人进行编辑?
  2. 有哪些更好的方法可以实现在 View 中渲染多语言 Markdown 文件?我对 :locale 和双字符串插值的使用似乎不太优雅。
  3. 有没有办法更改此代码,以便我可以将 Ruby 变量传递到 Markdown 文件中?例如,我知道我可以通过将 about.en.md 更改为 HAML 部分 (_about.md) 来在 Markdown 中使用 #{language} 变量。 en.html.haml)并将代码更改为如下所示:

    app/views/static_pages/about.html.haml

    - provide(:title, t('.about_us'))
    :markdown
    #{render "about.#{params[:locale]}", language: 'Markdown!'}

    但是,有没有办法在不将 Markdown 文件更改为其他类型文件的情况下做到这一点?如果存在这种方式,是否推荐/可行?

最佳答案

查看 this StackOverflow answer 后看来,i18n Markdown 文件的最佳位置是 config/locales 目录下它们自己的操作名称目录,并且有一个很好的机会重构 render StaticPagesController 的所有 View 上的代码。因此,下面以about.html.haml为例,调用home中的renderhelp关于联系 View 已更改为完全相同的代码:

app/views/static_pages/about.html.haml

- provide(:title, t('.about_us'))
:markdown
#{render file: localized_page_for(action_name, params[:locale])}

localized_pa​​ge_for 方法在 StaticPagesHelper 中定义:

app/helpers/static_pages_helper.rb

module StaticPagesHelper
def localized_page_for(action, locale)
"#{Rails.root}/config/locales/#{action}/#{action}.#{locale.to_s}.md"
end
end

所以,现在所有 Markdown 文件都已从 app/views/static_pages 目录中取出,并从各自的逻辑目录中调用(例如 config/locales/about/about .en.md 等)使用 ActionControlleraction_name 属性和区域设置,从而减少困惑。

对于上面的问题 2,字符串插值对于此类问题似乎足够常见,因此我也认为它足够“优雅”。

对于上面的问题3,经过详尽的搜索,我还没有找到任何人将变量传递到纯Markdown文件中的方法,并且the documentation似乎没有说任何支持他们的事情,所以我的结论是这是不可能的。如果绝对有必要将 Ruby 变量传递到 Markdown,则该文件将需要通过另一个解释器运行,类似于 this StackOverflow answer 中的描述。 .

更新:

运行安全扫描器后 Brakeman针对该应用程序,它提出了一个潜在的Dynamic Render Path由于将 params[:locale] 动态传递给 render 调用而不是向其传递静态字符串,因此出现安全警告(尽管很弱)。因此,我将对 localized_pa​​ge 方法的调用移出 View ,将该方法本身移出 StaticPagesHelper (以便该文件现在为空)并移入 StaticPagesController 然后在每个方法中实例化一个 @page 实例变量以传递给 View 。总之,代码现在看起来像这样,它没有收到安全警告:

app/controllers/static_pages_controller.rb

class StaticPagesController < ApplicationController

before_filter :localized_page, only: [:help, :about, :contact]

def home
if signed_in?
@micropost = current_user.microposts.build
@feed_items = current_user.feed.paginate(page: params[:page])
else
localized_page
end
end

def help
end

def about
end

def contact
end

private

def localized_page
@page = "#{Rails.root}/config/locales/"\
"#{action_name}/#{action_name}.#{params[:locale].to_s}.md"
end
end

app/views/static_pages/about.html.haml

- provide(:title, t('.about_us'))
:markdown
#{render file: @page}

关于internationalization - Rails 3 View 中的 i18n Markdown 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10233686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com