Rails 3视图中的i18n markdown文件

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文件的呈现方式.

我的问题是:

  1. static_pages目录位与降价文件拥挤,那么,有没有任何合理的缺省/最佳实践地点(或许之外的应用程序目录),以保持这些降价文件,在那里他们可以大概由谁也不需要人编辑了解应用程序的内部工作原理?
  2. 有哪些更好的方法可以在视图中实现渲染多语言Markdown文件?我:locale对双弦插值的使用似乎不够优雅.
  3. 有没有办法更改此代码,以便我可以将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文件更改为其他类型的文件的情况下执行此操作?如果存在这种方式,是推荐还是可行?

Pau*_*nti 5

看看这个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)