Pau*_*nti 4 markdown haml internationalization railstutorial.org ruby-on-rails-3.2
我目前正在研究Michael Hartl的Rails教程,同时尝试了本书未涉及的其他一些内容.在完成创建静态页面的第5章之后,我决定将视图代码更改为HAML,使页面国际化,并将静态内容放入单独的(非部分)Markdown文件中,使用RDiscount gem来呈现它们.例如:
应用程序/视图/ static_pages/about.html.haml
- provide(:title, t('.about_us'))
:markdown
#{render file: "static_pages/about.#{params[:locale]}.md"}
Run Code Online (Sandbox Code Playgroud)
在static_pages目录下,我有像about.en.md,about.it.md,about.ja.md等Markdown文件,因此:locale参数中的插值决定了Markdown文件的呈现方式.
我的问题是:
:locale对双弦插值的使用似乎不够优雅.有没有办法更改此代码,以便我可以将Ruby变量传递到Markdown文件?我知道我可以,例如,#{language}只需将about.en.md更改为HAML部分(_about.en.html.haml),就可以在Markdown中使用变量,并将代码更改为:
应用程序/视图/ static_pages/about.html.haml
- provide(:title, t('.about_us'))
:markdown
#{render "about.#{params[:locale]}", language: 'Markdown!'}
Run Code Online (Sandbox Code Playgroud)
但是,有没有办法在不将Markdown文件更改为其他类型的文件的情况下执行此操作?如果存在这种方式,是推荐还是可行?
看看这个StackOverflow答案之后,似乎i18n Markdown文件的最佳位置将是config/locales目录下的自己的动作名称目录,并且有一个很好的机会render在所有视图上重构代码StaticPagesController.因此,使用about.html.haml如下为例,呼吁render在家里,帮助,关于和联系的观点已经改变,以完全相同的代码:
应用程序/视图/ static_pages/about.html.haml
- provide(:title, t('.about_us'))
:markdown
#{render file: localized_page_for(action_name, params[:locale])}
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
所以,现在所有Markdown文件都已从app/views/static_pages目录中取出,并使用's 属性和语言环境从各自的逻辑目录(例如config/locales/about/about.en.md等)调用,减少混乱.ActionControlleraction_name
至于上面的问题2,字符串插值对于这类问题似乎很常见,所以我也会认为它"优雅".
至于上面的问题3,在详尽的搜索之后,我还没有找到任何人将变量传递到纯Markdown文件的方法,并且文档似乎没有说明支持它们,所以我将结束这是不可能的.如果将Ruby变量传递给Markdown是绝对必要的,那么该文件将需要通过另一个解释器运行,类似于此StackOverflow答案中描述的那样.
运行安全扫描后司闸员对应用程序,它想出了一个潜在的动态渲染路径安全警告(虽然是一个很脆弱的),由于动态地传递params[:locale]到render通话,而不是通过一个静态字符串.因此,我将调用localized_page移出视图中的方法,将方法本身移出StaticPagesHelper(使文件现在为空)并进入StaticPagesController,然后@page在每个方法中实例化一个实例变量以传递给视图.总之,代码现在看起来像这样,它没有得到安全警告:
应用程序/控制器/ 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
Run Code Online (Sandbox Code Playgroud)
应用程序/视图/ static_pages/about.html.haml
- provide(:title, t('.about_us'))
:markdown
#{render file: @page}
Run Code Online (Sandbox Code Playgroud)