2

私は次のファイルを持っています:

layouts/application.html.erb

<div class="container">
  <br>
  <%= flash_messages %>
  <%= yield %>
  <script type="text/javascript">
    $(document).ready(function() {
      $('select').each(function(idx, elem) {
        var $elem = $(elem);
        $elem.select2();
      });

      <%= yield :document_ready %>
    });
  </script>
</div>

これはindex.html.erbです:

user_transactions/index.html.erb

<% content_for :document_ready do %>
<% render :partial => 'shared/datepicker' %>
<% end %>
<h3><%= I18n.translate("user_transaction.add") %></h3>
...

今、私はより流動的なインターフェースが欲しかったので、コントローラーでこれを行いました:

user_transactions_controller.erb
def index
  @company = Company.find(params[:company_id])
  @user_transactions = @company.user_transactions.order("date DESC").all

  respond_to do |format|
    format.js { render :layout => false }
    format.html # index.html.erb
    format.json { render json: @user_transactions }
  end
end 

そして、次のファイルを作成しました。

user_transactions/index.js.erb    
document.getElementById('dashboard-body').innerHTML = 
  '<%= escape_javascript(render(:file => "user_transactions/index.html.erb")) %>'

:remote=>trueオプションを使用してページを呼び出します。それが良いかどうかはわかりませんが、うまくいきます。ここでこのテクニックを見つけました:js.html.erbファイルでindex.html.erbを返す方法

しかし、私が直面している問題の1つは、JavaScriptコードが機能しなくなったことです。実行する必要のあるselect2(レイアウト内)だけでなく、ビューindex.html.erb自体(datepicker)で宣言されている部分もあります。

JavaScriptを保持するだけでなく、ajaxと高速インターフェイスも保持するにはどうすればよいですか?

4

2 に答える 2

2

解決策を見つけました。

JavaScriptは、アプリケーションレイアウトを使用するページから呼び出しているため、ドキュメントに含まれていました。ただし、document.readyは呼び出されません。さらに、document.readyが呼び出されると(したがって、初めて)、イベントのバインドが解除されます。

ソリューションをDRYに保つために、次のように解決しました。

document.ready部分で実行する必要があるすべてのjavascript関数のパーシャルを作成しました。それらのパーシャル(または少なくともすべてのフォームで必要なパーシャル)を使用するようにlayouts / application.html.erbファイルを変更し、user_transactions/index.js.erbで必要なパーシャルを呼び出します。

そこで、この部分をindex.js.erbに追加しました

$(document).ready(function() {
  <%= render(:partial => "shared/select2") %>
  <%= render(:partial => "shared/datepicker") %>
});
于 2013-01-06T11:32:37.170 に答える
1

私には2つの悪い推測といくつかの質問があります:

:remote => trueでページを呼び出すとき、JSがページに存在することを確認しましたか?そして、あなたは正確にどこからページを呼んでいますか?

誤ったレイアウトを指定したため、スクリプトがページに表示されていない可能性があります。そのため、アプリケーションレイアウトを使用するページから呼び出さない限り、application.html.erbファイルには何もありません。

また、何が起こっているのかというと、レンダリングするときinnerHTMLにすべてのコードをプルしますが、JSは実際には再度実行されないため、のスクリプトdocument.readyはページに追加した新しいものを認識しません。を設定した後、JSを再度呼び出す必要がありますinnerHTML

を関数でラップし、を入力した後に何.each度も呼び出すことができます。document.readyinnerHTML

より良い説明のある同様の質問があります:Rails Ajax:.js.erbはJSではなくテキストとしてレンダリングされます

私は正しい方向に進んでいることを願っています。

于 2013-01-05T01:38:02.430 に答える