在Rails的3次国际化的降价文件(i18n markdown files in Rails 3 v

2019-09-16 15:50发布

我目前通过迈克尔·哈特尔的工作Rails的教程 ,而与未书中涵盖一些其他的事情尝试。 完成后第5章 ,其中创建静态页面,我决定视图代码更改为HAML,国际化页面,并把静态内容到单独的(非部分)降价文件,使用RDiscount宝石,使它们。 例如:

应用程序/视图/ static_pages / about.html.haml

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

根据static_pages目录,我有这样about.en.md降价文件,about.it.md,about.ja.md等,所以在插补:locale参数是什么决定了其语言的Markdown文件被渲染。

我的问题是:

  1. static_pages目录位与降价文件拥挤,那么,有没有任何合理的缺省/最佳实践地点(也许外面的应用程序目录中),以保持这些降价文件,在那里他们可以大概由谁也不需要人编辑了解应用程序的内部运作?
  2. 有什么更好的方法,在那里实现渲染视图多语种的降价文件? 我的使用:locale和双串插看起来不太优雅。
  3. 有没有办法来改变这种代码,以便我可以通过Ruby的变量进入降价文件? 我知道我可以,例如,使用#{language}中的变量降价只需更改about.en.md成HAML部分(_about.en.html.haml)和更改代码看起来是这样的:

    应用程序/视图/ static_pages / about.html.haml

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

    但是,有没有办法做到这一点不改变文件降价成另一种类型的文件? 如果这样的方式存在,它是推荐/可行吗?

Answer 1:

在看看经过这个StackOverflow的答案 ,它似乎是对国际化的Markdown文件的最佳位置将是配置下自己的动作名称目录/区域设置目录,并有重构的一个很好的机会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])}

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

所以,现在所有的降价文件已被取出应用程序/视图/ static_pages目录,并从各自的逻辑目录被称为(例如配置/区域设置/约/ about.en.md等)使用ActionControlleraction_name属性,语言环境,使更少的混乱。

对于上述问题2,串插似乎足够常见的这类问题,所以我会认为这是“优雅”足够为好。

对于上述问题3,经过详尽的搜索,我还没有找到一种方法的人变量已经通过以一个纯粹的降价文件,并将该文件似乎并没有说关于支持他们什么,所以我打算结束这是不可能的。 如果传递的Ruby变量降价是绝对必要的,该文件将需要通过另一种解释器运行,有点像在描述这个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

应用程序/视图/ static_pages / about.html.haml

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


文章来源: i18n markdown files in Rails 3 views