2009-07-19 6 views
0

私は奇妙な問題に遭遇しています。
ボタンを押すと、ページに読み込みアイコンが表示されます。
form_remote_forへの私の呼び出しにAjaxオプションが含まれている場合、RJSスクリプトは機能しません。form_remote_forにオプションを設定するとRJSが機能しなくなるのはなぜですか?

これは( "ロード" コントローラとRJSによって隠されている)作品:

ビュー:

<%=form_remote_for(:job, @job, {:url => {:action=>:create}}) do |f| %> 
[...] 
<div id="loading">Loading...</div> 

コントローラ:

def create 
    render :action => "create.js.rjs" 
end

RJS:

page.hide 'loading' 

これは(ちょうど:loading=>とロードを追加すると、図に示すが、それは前にあったように、コントローラによりバック隠されていない)動作しません。form_remote_for

<%=form_remote_for(:job, @job, {:url => {:action=>:create}}, {:loading=>"$('loading').show()"}) do |f| %> 
[...] 
<div id="loading" style="display:none;">Loading...</div> 

ので、もし私の呼び出しをAjaxオプションが含まれていると、RJSスクリプトは機能しません。どうして?

+0

ミック、私は私の答えを更新しました。それがあなたのために働くかどうか見てください。 – andymeadows

答えて

0
にフォームを変更し

:メイクは必ず作成

<% form_remote_for (:job, @job, :url => {:action => :create}, :loading =>"$('loading').show()") do |f| %> 
# ... 
<% end %> 

です:

# POST /jobs 
    # POST /jobs.xml 
    def create 
    render :action => "create.js.rjs" 
    end 

そして、あなたのcreate.js.rjs確認しては、次のとおりです。

page.hide 'loading' 

このシナリオは、のために働きます私。あなたがそれを持っていたので、私がした素早い足場の実装に基づいて、それが "新しい"に投稿されていたので、テンプレートのerbを戻していました。大規模な編集の前に私が言ったように、私は新しいですが、これはあなたに行くはずです。

編集:削除された "これはあなたのコードですか?"役職。

+0

私の実際のコードでなければ:)私は自分の投稿を修正しました。 – MickaelFM

+0

私はなぜ 理解していない - それは(括弧付き)RJS を使用していないときに動作 - それは(中括弧でまだ)RJSを使用していないとき - と中括弧がそのポスト削除されると、それはRJS – MickaelFM

+0

で動作中括弧を削除します/ jobsに戻って、中括弧を付けて/ jobs/newにポストします。なぜ私はちょうど観察された振る舞いに注意したのか分かりません。それはあなたのために働いてうれしい。 – andymeadows

0

:loadedパラメータを使用して、「rjs」ファイルに依存するのではなく、読み込みDIVを非表示にしましたか?

+0

これは ':loaded'とうまく動作し、頻繁に使用しています。しかし、コントローラのロジックとクライアントのJavaScriptが複雑な場合は、RJSでうまく動作します。私の例は単純化されました。 – MickaelFM

0

あなたが表示/非表示を行うためにAjax.Respondersを使用する必要があり、あなたの使ってプロトタイプを仮定:

Ajax.Responders.register({ 
    onCreate: function() { 
    Ajax.activeRequestCount++; 
     if($('loading') && Ajax.activeRequestCount>0) { 
     Effect.Appear('loading',{duration:0.4,queue:'end'}); 
     };   
    }, 
    onComplete: function() { 
    Ajax.activeRequestCount--; 
     if($('loading') && Ajax.activeRequestCount==0) { 
     Effect.Fade('loading',{duration:0.4,queue:'end'}); 
     };  
    } 
}); 

あなたはパブリック/ JavaScriptの中でそれを固執することができます/

控えめなJavaScriptをapplication.js - 動作します隠れた読み込みdivとajaxイベントを持つページで

関連する問題