0

現在、いくつかのレガシー コードをリファクタリングしようとしています。現在、次のようになっています。

コントローラ

def create
  # do stuff

  respond_to do |format|
    format.html { do stuff }
    format.js { render partial: 'stage_two', locals: { some instance variables } }
  end
end

次に、次のものviews/controller_name/_stage_two.js.erbがあります。

$('.some_element').children().fadeOut( function() {
  $('.some_element').children().remove();
  $('.some_element').html("<%=j render partial: 'form', locals: { stuff } %>");
  $('.some_element .stage_two').fadeIn();
});

したがって、基本的にコントローラー アクションは基本的に JavaScript をレンダリングします。そして、その特定のJavaScriptは、ページから要素を削除し、コンテンツを変更してからフェードインするだけです。これを行うより良い方法はありますか? 私は通常、javascriptがにあることを知っていapp/assets/javascriptsます.

4

2 に答える 2

1

現在の実装は、すでにかなり DRY であり、標準的な方法です。

html リクエストも同じ部分をレンダリングする必要がありますが、レイアウトが必要です。

js リクエストは、js レスポンスをレンダリングし (部分的にレンダリング)、ページの一部を更新する必要があります。

私は通常、javascript が app/assets/javascripts にあることを知っています。

これらはあなたのアセットです。これstage_two.js.erbは本質的にあなたのアセット ファイルではありません。代わりに、これは js 応答のアクション処理です。

確かに小さな更新アクションの場合は、json リクエストを使用して json 応答を受信して​​ビューを更新できますが、多くの場合 (特に大きなデータを処理する場合) は失敗し、現在の実装はその点で問題ありません...

于 2013-01-20T08:22:47.060 に答える
0

通常、これを行う通常の方法は、コントローラーが JSON を返すようにし (変数のフォーマットされたバージョンをレンダリングするようにします)、次に JS に通常の AJAX 呼び出しを実行させ、要素を JSON データで更新することです。

于 2013-01-20T08:16:19.657 に答える