4

私は現在、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"}

static_pagesディレクトリの下に、about.en.mdabout.it.mdabout.ja.mdなどの Markdown ファイルがあるため、パラメータの補間によって、:localeどの言語の Markdown ファイルがレンダリングされるかが決まります。

私の質問は次のとおりです。

  1. static_pagesディレクトリは Markdown ファイルで少し混み合っているため、これらの Markdown ファイルを保持するための賢明なデフォルト/ベスト プラクティスの場所 (おそらく app ディレクトリの外)はありますか?アプリの内部の仕組みを知っていますか?
  2. ビューで多言語 Markdown ファイルのレンダリングを実装するより良い方法はありますか? 私の使用:localeと二重文字列補間はエレガントではないようです。
  3. Ruby 変数を Markdown ファイルに渡すことができるように、このコードを変更する方法はありますか? たとえば、about.en.mdを HAML パーシャル ( _about.en.html.haml#{language} ) に変更するだけで、Markdown で変数を使用し、コードを次のように変更できることがわかっています。

    アプリ/ビュー/static_pages/about.html.haml

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

    しかし、Markdown ファイルを別の種類のファイルに変更せずにこれを行う方法はありますか? そのような方法が存在する場合、それは推奨/実行可能ですか?

4

1 に答える 1

5

この StackOverflow answerを見た後、i18n Markdown ファイルの最適な場所はconfig/localesディレクトリの下の独自のアクション名ディレクトリでありrenderStaticPagesController. そのため、以下の例のようにabout.html.hamlを使用するrenderと、homehelpabout、およびcontactビューでの呼び出しがまったく同じコードに変更されています。

アプリ/ビュー/static_pages/about.html.haml

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

localized_page_forメソッドは で定義されていStaticPagesHelperます。

app/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ディレクトリから取り出され、の属性とロケールを使用して、それぞれの論理ディレクトリ ( config/locales/about/about.en.mdなど)から呼び出されます。 、混乱を減らします。ActionControlleraction_name

上記の質問 2 に関しては、文字列補間はこの種の問題には十分一般的であるように思われるので、それも十分に「エレガント」であると考えます。

上記の質問 3 については、徹底的に検索した結果、誰も変数を純粋な Markdown ファイルに渡す方法を見つけられませんでした。ドキュメントにはそれらのサポートについて何も書かれていないようです。それは不可能だということです。Ruby 変数を Markdown に渡すことがどうしても必要な場合は、別のインタープリターを介してファイルを実行する必要があります。この StackOverflow answerで説明されているようなものです。

アップデート:

アプリに対してセキュリティ スキャナーBrakemanを実行した後、静的な文字列を渡す代わりに呼び出しに動的に渡すため、 Dynamic Render Pathの潜在的なセキュリティ警告 (弱いものではありますが) が表示されました。そのため、メソッドへの呼び出しをビューの外に移動し、メソッド自体を(ファイルが空になるように)外に移動し、ビューに渡すために各メソッドでインスタンス変数をインスタンス化しました。要約すると、コードは次のようになり、セキュリティ警告は表示されません。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

アプリ/ビュー/static_pages/about.html.haml

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