0

ウィジェットをサーバーするコントローラーがあります。

class WidgetsController < ApplicationController
  def widget1
    respond_to do |format|
      format.html
      format.js { render js: js_constructor }
    end
  end

  def widget2
    respond_to do |format|
      format.html
      format.js { render js: js_constructor }
    end
  end

  private
  def js_constructor
    content = render_to_string(params[:action], layout: false)
    "document.write(#{content.to_json})"
  end
end

このコントローラーは大きくなるので、すべてのアクションでこのコード ブロックを繰り返さないようにしたいと思います。

respond_to do |format|
  format.html
  format.js { render js: js_constructor }
end

何か案が?

編集:コンテキストを提供するためだけに...

ルートはフレキシブル/ダイナミックです:get 'widgets/:action', to: 'widgets#:action'

したがって、私がアクセスwidgets/widget1すると、ビューがレンダリングされますwidget1.html.erb

スクリプトを別のサーバーに含めると、widget1 が構築されます。

<script type='text/javascript' src='http://localhost:3000/widgets/widget1.js'></script>
4

2 に答える 2

1

「ビュー」をパラメーターとして受け取る単一のアクションを作成します。基本的に、#showさまざまなビューをレンダリングするアクションを実行しています。

get 'widgets/:template', to: 'widgets#show'

class WidgetsController < ApplicationController
  def show
    respond_to do |format|
      format.html { render params.require(:template) }
      format.js { render js: js_constructor }
    end
  end

  private
  def js_constructor
    content = render_to_string(params.require(:template), layout: false)
    "document.write(#{content.to_json})"
  end
end
于 2015-06-09T19:22:49.163 に答える
1

その答えはメタプログラミングです。

class WidgetsController < ApplicationController
  [:widget1, :widget2].each do |name|
    define_method(name) do
      respond_to do |format|
        format.html
        format.js { render js: js_constructor }
      end
    end
  end

  private

  def js_constructor
    content = render_to_string(params[:action], layout: false)
    "document.write(#{content.to_json})"
  end
end
于 2015-06-09T19:10:13.370 に答える