54

複数のモデルで共有されている部分ファイルをどこに配置すればよいですか? crop.html.erb1 つのモデルに使用される というページがありますPhoto。という別のモデルにも使用したいと思いUserます。

コードをコピーして貼り付けることはできますが、それはあまり DRY ではないので、パーシャルに移動することにしました。

2 つのモデル間で共有されているため、その部分をどこに配置しますか?

ありがとう!

4

7 に答える 7

62

Rails の慣例では、共有パーシャルを に配置し/app/views/sharedます。

于 2010-03-05T07:29:08.760 に答える
51

アップデート

レイアウトの継承は、ガイドのレイアウトとレンダリングの下にあり、 テンプレートの継承も同様に機能します。

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すると、上記は欠落しているすべてのパーシャルのフォールバックであり、今は確認できませんが、テンプレート自体についても...

Railscast: テンプレートの継承!

于 2012-03-27T14:56:44.470 に答える
29

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

于 2016-02-07T14:30:28.143 に答える
5

Rails ビューapp/views/layoutsではヘッダーやフッターなどの共有パーシャルに使用されますが、Ruby on Rails ガイドでは例app/views/sharedで使用されます。個人の好みによるところが大きいと思います。メイン ナビゲーションやフッターなどの高レベルのものには使用しますが、フォームなどのより狭いコントローラー レベルのものには使用します。layoutsshared

于 2012-11-27T13:47:18.660 に答える
3

私は通常、よく使用されるパーシャルを含むビューに共有フォルダーを持っています。

于 2010-03-05T05:12:22.893 に答える
0

どこに置いても構いません。ファイルのパスを提供することで、任意の場所に任意のパーシャルをレンダリングできますrender。レンダリングするコントローラーに関連付ける必要はありません。partialsディレクトリの下で単純に呼び出されるディレクトリを使用し、次のviewようにパーシャルを呼び出します。

render :partial => 'partials/mypartial'
于 2010-03-05T05:24:40.390 に答える