4

我目前正在阅读 Michael Hartl 的Rails 教程,同时尝试书中未涵盖的其他一些内容。完成第 5 章创建静态页面后,我决定将视图代码更改为 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目录下,我有诸如about.en.mdabout.it.mdabout.ja.md等 Markdown 文件,因此在:locale参数中插值决定了渲染哪种语言的 Markdown 文件。

我的问题是:

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

    app/views/static_pages/about.html.haml

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

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

4

1 回答 1

5

在查看了这个StackOverflow 答案后,似乎 i18n Markdown 文件的最佳位置是config/locales目录下它们自己的操作名称目录,并且有一个很好的机会来重构. 因此,使用about.html.haml作为下面的示例,在homehelpaboutcontact视图中的调用已更改为完全相同的代码:renderStaticPagesControllerrender

app/views/static_pages/about.html.haml

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

localized_page_for方法定义在StaticPagesHelper

应用程序/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目录中取出,并使用's属性和语言环境从它们各自的逻辑目录(例如config/locales/about/about.en.md等)中调用,减少混乱。ActionControlleraction_name

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

至于上面的问题3,经过详尽的搜索,我还没有找到任何人将变量传递给纯Markdown文件的方法,并且文档似乎没有说明支持它们,所以我将得出结论这是不可能的。如果将 Ruby 变量传递给 Markdown 是绝对必要的,那么文件将需要通过另一个解释器运行,有点像这个 StackOverflow 答案中描述的。

更新:

在对应用程序运行安全扫描程序Brakeman后,由于动态传递给调用而不是传递静态字符串,它提出了一个潜在的动态渲染路径安全警告(尽管是一个弱警告) 。因此,我将对该方法的调用移出视图,将方法本身移出(因此该文件现在为空)并移入,然后在每个方法中实例化一个实例变量以传递给视图。总之,代码现在看起来像这样,它没有收到安全警告:params[:locale]renderlocalized_pageStaticPagesHelperStaticPagesController@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

app/views/static_pages/about.html.haml

- provide(:title, t('.about_us'))
:markdown
  #{render file: @page}
于 2012-06-19T12:22:18.420 回答