我目前正在研究Michael Hartl的Rails Tutorial,同时试验了本书未涉及的其他一些内容。在完成创建静态页面的Chapter 5之后,我决定将视图代码更改为HAML,使页面国际化,并将静态内容放入单独的(非部分)Markdown文件中,使用RDiscount gem来渲染它们。例如:
应用/视图/ static_pages / about.html.haml
- provide(:title, t('.about_us'))
:markdown
#{render file: "static_pages/about.#{params[:locale]}.md"}
在 static_pages 目录下,我有Markdown文件,例如 about.en.md , about.it.md , about .ja.md 等,因此:locale
参数中的插值决定了Markdown文件的呈现方式。
我的问题是:
:locale
和双字符串插值的使用似乎不够优雅。有没有办法更改此代码,以便我可以将Ruby变量传递到Markdown文件中?我知道我可以在Markdown中使用#{language}
变量,只需将 about.en.md 更改为HAML部分( _about.en.html.haml < / strong>)并将代码更改为:
应用/视图/ static_pages / about.html.haml
- provide(:title, t('.about_us'))
:markdown
#{render "about.#{params[:locale]}", language: 'Markdown!'}
但是,有没有办法在不将Markdown文件更改为其他类型的文件的情况下执行此操作?如果存在这种方式,是推荐还是可行?
答案 0 :(得分:5)
看了this StackOverflow answer之后,i18n Markdown文件的最佳位置似乎是 config / locales 目录下的自己的动作名称目录,并且有一个在render
的所有视图上重构StaticPagesController
代码的好机会。因此,使用 about.html.haml 作为示例,在主页,帮助,render > about ,联系视图已更改为完全相同的代码:
应用/视图/ static_pages / about.html.haml 强>
- provide(:title, t('.about_us'))
:markdown
#{render file: localized_page_for(action_name, params[:locale])}
localized_page_for
方法定义了StaticPagesHelper
方法:
应用/助手/ 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 等)使用ActionController
的{{1}}属性和区域设置,减少了混乱。
对于上面的问题2,字符串插值对于这类问题似乎很常见,所以我也会认为它“优雅”。
至于上面的问题3,经过详尽的搜索,我还没有找到任何人将变量传递到纯Markdown文件的方式,the documentation似乎没有说任何关于支持它们的方法,所以我将得出结论,这是不可能的。如果将Ruby变量传递给Markdown是绝对必要的,那么该文件将需要通过另一个解释器来运行,类似this StackOverflow answer中所述。
针对应用运行安全扫描程序Brakeman之后,由于动态传递action_name
到{{1},它出现了潜在的Dynamic Render Path安全警告(尽管是弱警告)调用而不是传递静态字符串。所以,我将调用移到视图中的params[:locale]
方法,将方法本身移出render
(以便文件现在为空),然后移到localized_page
然后在每个方法中实例化一个StaticPagesHelper
实例变量以传递给视图。总之,代码现在看起来像这样,它没有得到安全警告:
应用/控制器/ static_pages_controller.rb 强>
StaticPagesController
应用/视图/ static_pages / about.html.haml 强>
@page