1

私には2つの異なるレイアウトがあります。1つは完全にカスタムで、もう1つはブートストラップです。管理者の場合はブートストラップビューをレンダリングし、非管理者の場合は通常どおりにレンダリングします。管理者とユーザーは多くのビューを共有しないため、ほとんどの場合、これは非常に簡単ですが、いくつかあります。

render私の当初のアイデアは、ファイルのブートストラップバージョンがあるかどうかをチェックするようにオーバーライドすることでした。したがって、たとえば、ブートストラップ固有のテンプレートが_user.html.erbあり、これがあります。_user.bootstrap.html.erb

コントローラーを変更したくないので、理想的には、render 'form'スマートに動作し、あるかどうかを確認し、_form.bootstrap.html.erbない場合はフォールバックします。_form.html.erb

最初の試み

私の最初の試みはこのように見えました

# I don't think this is the actual method signature of render
def render(options=nil, extra_options, &block)
  # if it should render bootstrap and options is a string and there exists a bootstrap version
  #   set it up to render the bootstrap view
  super(options, extra_options, &b)
end

現在の試み

基本的にファイルが存在するかどうかをチェックし、erbを使用するテンプレートを登録することを考えています。私はまだこれに向けて進展を遂げていません。

4

1 に答える 1

0

私はそれを考え出した。これは私がそれをした方法です:

これは、アプリケーションコントローラで設定されます。before_filter :render_bootstrap

def render_bootstrap
  return unless bootstrap?
  new_action = "#{self.action_name}.bootstrap"
  has_bs_view = template_exists?(new_action,params[:controller],false) ||  template_exists?(new_action,params[:controller], true)
  if has_bs_view
    self.action_name = new_action
  end
end

これをさらに拡張して、ビューの内部を実行しなくてshow.bootstrap.html.erbも使用できるようにすることにしました。これは、レールレンダリングヘルパーを上書きすることによって行われました。render "form"render "form.bootstrap"

于 2013-02-06T21:03:16.740 に答える