2

各リクエストの URL で渡された GET パラメータに従って、アプリケーションのレイアウトを変更しようとしています&layout=name_of_the_layout

そして私の application_controller で:

class ApplicationController < ActionController::Base
  layout :get_layout_from_params

  private
  def get_layout_from_params
    if params['layout']
      params['layout']
    else
      'application'
    end
  end
end

正常に動作しますが、ユーザーがアプリケーションをナビゲートするときにレイアウトを「永続化」するには、ビューの各 Rails ルート ヘルパーにこのパラメーターを追加する必要があります (フォームの POST リクエストの場合でも…)。

ressource_path(@ressource, :layout => get_layout_from_url())

whereは、URL に が設定されているかどうかを確認し、検証してから返すget_layout_from_url()ヘルパーです。params['layout']

これは間違いなく DRY ではありません...ビューに追加のコードを記述せずに、すべてのルートヘルパーをオーバーライドしてこの動作を含めるにはどうすればよいですか? ビューで標準の Rails メソッドを呼び出したい:ressource_path(@ressource), ...

または、これを達成するためのよりスマートな方法はありますか?

PS:レール3.2.3を使用しています

ありがとう !

4

2 に答える 2

2

リクエストごとにURLに追加するのではなく、セッションに保存する方がよいと思います。

Rails では、セッションを非常に簡単な方法で使用できます。

def get_layout_from_params
  if params['layout']
    session['layout'] = params['layout']
  else
    session['layout'] || 'application'
  end
end

がある場合はparams['layout']、ユーザーがレイアウトを変更しようとしていることを意味するので、それをセッションに割り当てます。

指定されていない場合params['layout']は、存在するかどうかをチェックし、それをsession['layout']返す'application'か、session['layout'] が false または nil の場合に返します。

- - 編集 - -

次のバージョンはさらに短いバージョンです。気に入るかどうかを確認してください。

def get_layout_from_params
  session['layout'] = params['layout'] || session['layout'] || 'application'
end
于 2012-05-29T09:47:07.470 に答える
2

古くて非推奨になったものは、次のdefault_url_optionsように置き換えられましたurl_options

class ApplicationController < ActionController::Base
  def url_options
    { :layout => validate_layout }.merge(super)
  end

  def validate_layout
    # some stuff reusable
    params[:layout]
  end
end

合わない場合は近いです。

于 2012-05-29T09:56:33.453 に答える