0

コードには次のようなレンダリングがあります。

erb :login, :layout => :layout
<%= erb :_maintabs %>

これらのコード行を、同じことを行う次のような 1 行の関数に変更したかっただけです。

erb :login, :layout => Main::get_layout
<%= erb Main::my_tabs %>

これにより、コードを拡張するためのプラグインを作成できるようになりますが、一緒に働いている担当者はそれについて興奮していないようで、そのような種類の変更をコードにチェックすることを望んでいません。私の質問は、sinatra レンダリングを変更して、レイアウト名に基づいて別のレイアウトまたはビューをレンダリングする方法はありますか? その乗り越しは、より低いレベルで行う必要があります。

4

2 に答える 2

0

register() によって追加されたルートの 1 つにいる場合、Main クラスにいて、Main に erb() メソッドがあることが示されるので、オリジナルを保存しながらそれをオーバーロードしてから、途中でパラメータを変更するかどうかはオリジナルです。

app.get '/index' do   
  puts '---------------- in idx ---------------------- ' + self.class.to_s
  p self.methods
  erb :index, :layout => :layout, :locals => {:test_runs => test_runs, :tests => tests}
end
于 2013-06-14T19:16:49.790 に答える
0

this seems to work and is what I was looking for,

I overload the main class from my plugin

class Main


  def my_erb(view,opts={})
    new_view = view
    # puts '--------------------------- in ERB for template: ' + view.to_s

    if view.eql?(:layout)
      new_view = :my_layout
    elsif view.eql?(:_maintabs)
      new_view = :_my_maintabs
    end
    # puts 'view is now ' + view.to_s

    old_erb new_view,opts
  end

alias_method :old_erb, :erb
alias_method :erb, :my_erb



end
于 2013-06-17T21:00:18.093 に答える