複数のモデルで共有されている部分ファイルをどこに配置すればよいですか? crop.html.erb
1 つのモデルに使用される というページがありますPhoto
。という別のモデルにも使用したいと思いUser
ます。
コードをコピーして貼り付けることはできますが、それはあまり DRY ではないので、パーシャルに移動することにしました。
2 つのモデル間で共有されているため、その部分をどこに配置しますか?
ありがとう!
複数のモデルで共有されている部分ファイルをどこに配置すればよいですか? crop.html.erb
1 つのモデルに使用される というページがありますPhoto
。という別のモデルにも使用したいと思いUser
ます。
コードをコピーして貼り付けることはできますが、それはあまり DRY ではないので、パーシャルに移動することにしました。
2 つのモデル間で共有されているため、その部分をどこに配置しますか?
ありがとう!
Rails の慣例では、共有パーシャルを に配置し/app/views/shared
ます。
アップデート
レイアウトの継承は、ガイドのレイアウトとレンダリングの下にあり、 テンプレートの継承も同様に機能します。
Rails 3.1 以降のバージョンではテンプレートの継承が実装されているため、共有パーシャルの正しい場所は今/app/views/application/
だと思いproducts#index
ます。
-# products#index
= render @products.presence || 'empty'
-# /app/views/application/_empty.html.haml
There are no items
ところでapplication
、接続はコントローラーの継承であるため、これはProductsController < ApplicationController
このように実装/app/views/products/_empty.html.haml
すると、上記は欠落しているすべてのパーシャルのフォールバックであり、今は確認できませんが、テンプレート自体についても...
TL;DR
Rails 3.1、Rails 4、Rails 5、そして次に来るものは何でも
app/views/application
コントローラ パスにビューが見つからない場合、エンジンはこのパスを自動的に検索します。
Rails 3 以前
app/views/shared
エンジンは、このパスを自動的に検索しません。
長い話
Rails 3 (およびそれ以前のバージョン) には、共有ビューを保存するデフォルトの場所がありません。
非公式の慣例では、共有ビューをapp/views/sharedに保存します。ただし、それらを保存する場所はどこでも、パスを指定する必要があります
# render app/views/shared/menu.html.erb
<%= render :partial => "shared/menu" %>
この提案は、Rails を使用した Agile Web Developmentによって広められました。
Rails 3.1では、共有ビューを保存する場所に関する公式の標準が導入されました:
app/views/applicationこの標準のおかげで、エンジンはapp/views/application 内のテンプレートを自動的に探すようになりました。その結果、フル パスを使用する必要がなくなりました。
興味のある方は、この決定の背後にある思考プロセスをここでたどることができます.
古い構文
# render app/views/application/menu.html.erb
# unless menu.html.erb is found in appp/views/my_controller
<%= render :partial => "menu" %>
新しい構文
# render app/views/application/menu.html.erb
# unless menu.html.erb is found in appp/views/my_controller
<%= render partial: "menu" %>
もちろん、共有ビューを好きな場所に配置して、パスで参照することもできます
<%= render :partial => "my_own_special_shared_folder/menu" %>
ただし、これを行う非常に正当な理由がない限り、新しい標準に固執し、共有ビューを に保存してくださいapp/views/application
。
私は通常、よく使用されるパーシャルを含むビューに共有フォルダーを持っています。
どこに置いても構いません。ファイルのパスを提供することで、任意の場所に任意のパーシャルをレンダリングできますrender
。レンダリングするコントローラーに関連付ける必要はありません。partials
ディレクトリの下で単純に呼び出されるディレクトリを使用し、次のview
ようにパーシャルを呼び出します。
render :partial => 'partials/mypartial'