1

私は最近、Rails アプリケーションの一部を別の Web サイトの iframe 内にロードする仕事を任されました。関連するページは別のレイアウト ファイルを使用する必要がありますが、iframe 内でレンダリングされている場合に限ります。ここで提案された解決策がありましたDetect iframe request in a rails app that includes a query string parameter.

たとえば、要求している Web サイトは、src の iframe を介してアプリケーションを呼び出すことができますhttp://foo.com/bar?iframe=true。次に、コントローラーで次のことを簡単に確認できます。

def bar
  render :template => "iframe" if params[:iframe]
end

これは良い解決策のように思えますが、残念ながら、元のクエリ文字列は完全に静的であるため、最初のリクエストでしか機能しません。iframe 内の他のルートへのアクセス可能なリンクがあると仮定すると、iframe=trueリクエスト パラメータを簡単に中継して、コードを繰り返さずに正しい iframe レイアウトを維持する方法はありますか? 基本的に、既存の機能を壊すことなく、可能な限り DRYest アプローチを採用したいと考えています。このパラメーターが存在する場合に中継するロジックを含む別の link_to ヘルパーを作成し、アプリケーション全体のすべての link_to 呼び出しを置き換えることを検討しました。しかし、誰かがより良いアプローチを持っているかどうか疑問に思っていました。

4

1 に答える 1

1

JavaScriptを使用してこの問題に取り組むことにし、hamlレイアウトファイルに以下を追加しました。

:javascript
    for(i = 0; i< $('a').length; i++)
    {
      if($('a')[i].href.match(document.domain))
      {
        $('a')[i].href = $('a')[i].href + "?iframe=true";
      }
    }

これをサーバー側でのiframeパラメータのチェックと組み合わせると、適切なレイアウトが読み込まれるようになります。この機能はJavaScriptを有効にしているユーザーにのみ提供することにしたので、最善の解決策ではない可能性があります。このアプローチのその他の唯一の問題は、コントローラーのリダイレクトとフォームにあり、iframeパラメーターを手動でチェックして、それに応じて転送する必要があります。DRYではありませんが、少なくともロジックをコントローラーメソッドに入れることができました。より良い解決策を知っている人がいたら、遠慮なく答えを残してください。

于 2013-02-04T21:26:16.847 に答える