2

ビューに次のJavaScriptがあります。

<script type="text/javascript">
    var pusher = new Pusher('<%= Pusher.key %>'); // Replace with your app key
    var channel = pusher.subscribe('choices');

    channel.bind('created', function(data) {
        var after = $('.ticket:last').attr('data-time');
        $("#tickets").append("<%=raw escape_javascript(render(@tickets, :after => " + after + ")) %>");
    });
</script>

そして、私のコントローラーでは次のようになります。

@tickets  = Choice.where("choices.created_at > ?", Time.at(params[:after].to_i + 1).utc)

JavaScriptからコントローラーにafterparamを渡す方法を探しています。これは、created_atが現在表示されている最後のChoiceよりも高いChoiceのみを返します。

私はこの行が仕事をしていないと思うので、これに関する少しの助けは非常に応用されるでしょう:)

$("#tickets").append("<%=raw escape_javascript(render(@tickets, :after => " + after + ")) %>");

編集:

これで、 after変数のコントローラーへの受け渡しが修正されたようです。Firebugをチェックしたところ、応答に最新のBETのデータが含まれていることがわかりました。しかし、ビューはまだ間違っています。最新のベットをDIVに追加する代わりに、過去のすべてのベットを2回表示し、新しいベットはまったく表示しません。誰?:)

ファイルを閲覧する:

<script type="text/javascript">
    var pusher = new Pusher('<%= Pusher.key %>'); // Replace with your app key
    var channel = pusher.subscribe('choices');

    channel.bind('created', function(data) {
        var after = $('.ticket:last').attr('data-time');

        var settings = { after: after}
        $.ajax({
            url: '/Home/Index',
            type: 'POST',
            dataType: 'json',
            data: settings,
            cache: true,
            success: function (data) {
                $("#tickets").append("<%=raw escape_javascript(render(@tickets)) %>");
                }
          });
        }
    );
</script>

ルート:

post 'Home/Index' => 'home#index'

コントローラ(インデックスアクション):

@tickets  = Choice.betable(current_user).where("choices.created_at > ?", Time.at(params[:after].to_i + 1).utc)

respond_to do |format|
  format.json { render :json => @tickets }
  format.html
end

解決:

多くの試行錯誤の末、私は解決策を使用することになりました。そこでは、ビューのjavescriptコードではなく、コントローラーでHTMLをレンダリングします。このようにして、必要なパラメータにアクセスできます。

respond_to do |format|
  format.html      
  format.json do
    @html = render_to_string( :partial => '/choices/choice.html.erb', :locals => { :choice => @tickets} )
    render :json => { :success => true, :html => @html }
  end
end

延長された助けをくれたChazt3nに感謝します:)本当にそれをappriciated..

4

1 に答える 1

1

AJAX経由で送信できると思います

Function sendAfter((string?) after){
 var settings = { after: after}
 $.ajax({
        url: '/Controller/Action',
        type: 'POST',
        dataType: 'json',
        data: settings,
        cache: true,
        success: function (data) {}
      });
}

これにより、少なくともデータがコントローラーに渡されます。その関数を呼び出して、パラメーターを必要な場所に送信するだけです。

于 2012-10-15T21:27:54.090 に答える