2012-02-04 6 views
0

メインアプリケーションレイアウトをサブアプリケーションに使用するにはどうすればよいですか?Padrino:メインプロジェクトとサブアプリケーションのレイアウトを共有

コントローラのレイアウトオプションがありますが、代わりに親プロジェクトに戻り、代わりにapplication.hamlを使用するために値を設定しますか?

File.expand_path('../../app/views/layouts/application.haml', __FILE__) 

残念ながら、それは現在のアプリのレイアウトフォルダのパスのように見えるコントローラにいつもあなたが

c:/sites/demo/app01/views/layouts/c:/sites/demo/app/views/layouts/application.haml 
のようなもので終わるので、それの前に追加されます。

は、私が追加してみました

また、.hamlはすでに、あなたが

application.haml.haml 
で終わるコントローラに追加しますので、もし追加されます

これはコントローラの場合のみです。

これらの結果に基づいて、コードをサブapp.rbに移動しました。これは実際に自分の状況に適しています。

しかし、メインレイアウトはレンダリングされないので、現在のコントローラアクションの結果のみが表示されます。レイアウトを出力しません。

ファイルエクステンションなしで試しました。返されるパスは正しいので、なぜそれを使用していないのか分かりません。

コントローラで少なくとも無効な引数だったため、エラーが発生しました。

サブアプリケーションのapp.rbにコードを記述してもエラーは発生しませんが、レイアウトはレンダリングされません。ビューの結果だけ。

あなたがメインのアプリやコントローラの内部で使用することができます

答えて

0

を私は問題が事前保留コントローラと一緒にいた場所を確認するために少し時間を費やしabsファイルのパスを指定するときは、現在のアプリケーションのレイアウトフォルダを使用してレイアウトします。

ファイル:Padrinoのコア/アプリケーション/ rendering.rb

方法:fetch_layout_path

私は腹筋のファイルパスを参照してチェックする場合/他を追加しました。

return cached_layout_path if cached_layout_path 
if File.exists?(layout_name.to_s) 
    layout_path = layout_name.to_sym 
else 
    has_layout_at_root = Dir["#{views}/#{layout_name}.*"].any? 
    layout_path = has_layout_at_root ? layout_name.to_sym : File.join('layouts', layout_name.to_s).to_sym 
    end 
@_cached_layout[layout_name] = layout_path unless reload_templates? 
layout_path 

ただし、それでもエラーが発生していました。

ファイル:sinatra-1.3.2/lib/sinatra/base。RB

方法:find_template

私は右これはエラーなしで働いている

yield ::File.join(views, "#{name}.#{@preferred_extension}") 

yield name.to_s if File.exists?(name.to_s) 

を追加しました。

私はシンシア/パンドリーノではルビーの新機能がとても新しくなっていますので、これは正しいアプローチではないかもしれませんが、それは機能し、私の現在の開発で前進することができます。

DAddYE:より良い選択肢について、あなたのご意見をお聞きしたいと思いますか?子アプリケーションのapp.rbでレイアウトを設定しても何もしないように見えるのはなぜか分かりませんが、後で調べてみます。

+0

私はあなたがsinatraまたはpadrinoをアップグレードする瞬間にこれに代わる解決策があることを望んでいます、それは再び壊れるでしょう。 私はいつもgithubをフォークして、私は推測して、ちょうどすべてのアップデートをマージすることができます。 – Mike

0

# in project/parent_app/sub_app/app.rb 
layout File.expand_path('../../parent_app/views/application.haml', __FILE__) 

は、これがレンダリングされます:

# project/parent_app/views/application.haml 
+0

デフォルトのレイアウトはアプリケーションです。これは私が現在行っているものです。しかし私は私のプロジェクトapplication.hamlを自分の代わりに使用するようにサブアプリケーションに指示する方法を見つけることができませんか?私がパスを設定するとき、それは常に私のサブアプリケーションの名前をパスに入れます。 現在のアプリの上の1つのディレクトリにあるレイアウトを指すようにレイアウトパスを設定する方法の例を教えてください。 – Mike

+0

コードを更新しました。 – DAddYE

+1

の結果が掲載されました。コントローラーに例外をスローします。それをサブアプリケーションのapp.rbに追加しても例外はスローされませんが、ビューの結果のみがレンダリングされます。それはレイアウトを除外します。 – Mike

0

fetch_layout_path MUSTは相対パスである必要があります。 だから、これを行う必要がありますpadrino-core/application/rendering.rb

私のために働いています。しかし、padrinoが入れ子にされたサブアプリケーションを許可するならば、完全な方法ではありません。

def fetch_layout_path(given_layout=nil) 
    layout_name = given_layout || @layout || :application 
    @_cached_layout ||= {} 
    cached_layout_path = @_cached_layout[layout_name] 
    return cached_layout_path if cached_layout_path 
    has_layout_at_root = Dir["#{views}/#{layout_name}.*"].any? 
    layout_path = has_layout_at_root ? layout_name.to_sym : File.join('layouts', layout_name.to_s).to_sym 
    # Check the layout file is exists in sub-app? 
    # try to use the root project's layout if not 
    # added via riceball 
    has_layout = Dir["#{views}/#{layout_path}.*"].any? 
    layout_path = has_layout ? layout_path : File.join('..', '..', 'app', 'views', layout_path.to_s).to_sym 
    @_cached_layout[layout_name] = layout_path unless reload_templates? 
    layout_path 
    end 
関連する問題