2016-06-01 34 views
0

ajaxを使用してgetリクエストでデータを送信しようとしていますが、paramが送信されていないようです。私はdbからランダムな項目を示すページを持っています。あなたはnavbarのリンクからこのページに行きます。このページに移動すると、現在のアイテムをスキップして別のランダムなアイテムを見つけることができるリンクがあり、次のアイテムがユーザーが見ていたものでないことを確認します。Rails - なぜajaxがGETリクエストにparamsを送信しないのですか?

routes.rbを

get 'pending', to: 'items#pending'

<%= link_to 'Skip', '', class: "btn btn-default btn-xs", 
        id: "skip-btn", 
        :'data-item-id' => @pending_item.id %> 

コントローラ

def pending 
    @previous_pending_item_id = params[:id] || 0 
    @pending_items = Item.pending.where("items.id != ?", @previous_pending_item_id) 
    @pending_item = @pending_items.offset(rand @pending_items.count).first 
    respond_to do |format| 
     format.js 
     format.html 
    end 
    end 

私はnavbarリンクのアクションとページのリンクを使用しているので、htmlとjsの両方に応答しました。ページ上のリンクはスキップボタンで、別のランダムな項目が表示されます。

sitewide.js.erb

$('#skip-btn').on('click', function() { 
    $.ajax({ 
     data: {id: $(this).data("item-id")}, 
     url: "/pending" 
    }); 
    }); 

私は、サーバーのログに見るとStarted GET "/pending"...氏は述べているが、送信されているのparamの一切の言及がありません。私は何が欠けていますか?

なぜ私はこのためにajaxを使用しているのですか?なぜなら、私はurlにparamを表示したくないからです。

説明のために、このページにアクセスするときにurlが必要です。このページには、uramsで識別されたparamsまたはadditional:idが常に/保留中である必要があります。このページには常にdbというランダムなレコードが表示されます。私がパラメを送る必要がある唯一の理由は、ランダムであっても連続して記録が繰り返されないようにすることです。

+0

ネットワークリクエストにIDが表示されていますか? – epascarello

+0

@epascarelloどこでこれを探すのですか?私はクロムブラウザを使用しています – user4584963

+0

送信するものがあることを確認するためにconsole.log($(this).data( "item-id")を追加してください) –

答えて

1

は、私はあなたがデフォルトのリンクアクションを防ぐために必要があると思う:

$('#skip-btn').on('click', function (event) { 
    event.preventDefault(); 
    ... 
    }); 
+0

これは助けになりました。今、端末はparamを表示しますが、今はページがどこにも連れてこないのです。ボタンはクリックされたように見えますが、何も起こりません。 – user4584963

+0

これはajaxの仕組みで、ページを更新しません。 – Bob

+0

私はajaxを使用している理由は、URLに表示されていない情報をコントローラに送信することです。あなたが知っているこれを行うための良い方法はありますか?そうでない場合、どのようにページをリフレッシュさせるのですか? – user4584963

1

ながらできそれはあなたがしようとしている方法は、私はそれがGET要求でデータを送信することであることを指摘する価値があると思いますか反パターンのビット。だから、それを「正しい」方法でやってはどうでしょう?私はそのを送信する形式をチェックすることができたい

$('#skip-btn').on('click', function() { 
    $.ajax({ 
     url: "/pending/" + $(this).data("item-id") 
    }); 
    }); 
+0

あなたの答えで404エラーが見つかりませんでしたので、私も 'url:"/pending?= "+ $(これ)を試しました。データ( "item-id")が表示されますが、ボタンをクリックすると何も起こりません。端末を見ると、get要求が/ pendingに送られているように見えますか?= 33 – user4584963

+0

?idフィールドには?=は必要ありませんが、保留中とID番号の間に '/'が必要です。あなたはそれを追加しましたか? – gravityplanx

+0

はい、私のルートは:idを受け付けないように設定されています。ユーザーレコードを訪問/保留中にランダムにする必要があり、ユーザーが特定のレコードに戻ることを望んでいません。私はこのページのURLを常に/ pendingとして表示したいのですが、同じレコードが決して連続して繰り返されないように、パラメータを送信する方法が必要でした。 – user4584963

1

はあなたに routes.rbをを変更

get 'pending/:id', to: 'items#pending' 

とにsitewide.js.erbを変更しますあなたのコントローラへのクエリ。フロントエンドで受け取りたい形式の種類。

$('#skip-btn').on('click', function (e) { 
    e.preventDefault(); 
    $.ajax({ 
    dataType: 'json', //This will ensure we are receiving a specific formatted response 
    data: {id: $(this).data("item-id")}, 
    url: "/pending" 
    }); 
}); 

コントローラでは、jsonオブジェクトとして戻すことができます。

def pending 
    #@previous_pending_item_id = params[:id] || 0 
    #No need to make it an instance variable 
    previous_pending_item_id = params[:id] || 0 

    #Same goes for pending_items. No need to make it a instance variable, unless you're using it somewhere else. 
    pending_items = Item.pending.where("items.id != ?", previous_pending_item_id) 
    @pending_item = pending_items.offset(rand pending_items.count).first 
    respond_to do |format| 
    format.js 
    format.html 
    format.json { render json: @pending_item.as_json } 
    end 
end 

レスポンスの価値をあなたのページに追加することができます。

同様にjsまたはhtmlの応答が返ってくることを期待している場合は、ajaxコールでそのことを言及する必要があります。あなたの問題を解決するのに役立つかどうか教えてください。

更新:

はのは、あなたのページで言ってみましょう、それはdivの中@pending_itemオブジェクトのデータを示し、

<div id="pending_item">...</div>

あなたにAJAX要求を作っていますコントローラでは、div#pending_itemに新しいpending_itemを表示させます。あなたは

インスタンス変数@pending_itemと表示データにアクセスします

format.html { render partial: 'pending_item', layout: false } 

そして、あなたの部分的なファイル「_pendint_item.html.erb」で:あなたのような何かをお使いのコントローラで

$('#skip-btn').on('click', function (e) { 
    e.preventDefault(); 
    $.ajax({ 
    dataType: 'html', //we'll receive a html partial from server 
    data: {id: $(this).data("item-id")}, 
    url: "/pending", 
    success: function(res){ 
     //We'll set the html of our div to the response html we got 
     $("#pending_item").html(res); 
    } 
    }); 
}); 

これはサーバーへの応答をhtmlとして送信し、そこでdivのhtmlのみを設定します。

アップデート2

あなたの部分は次のようになります、またはあなたの保留中のアイテムを表示したいだけしかし。あなたがコントローラのメソッドで定義した同じインスタンス変数@pending_itemにアクセスしていることを知っておいてください。それにはlocalsを渡します。

<div class="pending_item"> 
    <h3><%= @pending_item.name %></h3> 
    <p><%= @pending_item.description %></p> 
</div> 

私はあなたが戻ってサーバから取得しているかを確認するためにあなたのAJAX呼び出しの成功コールバックでconsole.log(res)を行うことをお勧めします。

+0

なぜjsonがここで使用されているのか混乱しています。コントローラの保留中のアクションにidパラメータを送り、 'pending.html.erb'をレンダリングするだけです。 – user4584963

+0

大丈夫です。したがって、あなたがajax経由でコントローラにデータを送信しているときは、ページをリロードしたり、ページに何かを自動的にロードしたりすることはありません。これは、非同期的にすべてを行うために、ajaxを使用する全体のポイントです。したがって、ajax呼び出しを使用してページをレンダリングする場合は、自分で行う必要があります。私たちの場合、 '@ pending_item'オブジェクトのjsonレスポンスを取得する場合、データからhtml要素を取り出してDOMに追加します。 – Kumar

+0

あなたは、私がインスタンス変数にアクセスし、データを表示すると言う。これで何を意味しますか、部分的な外観はどうでしょうか?ページ全体を再レンダリングする効果が必要だった場合、部分( '_pending_item.html.erb')を' pending.html.erb'と全く同じに設定する必要がありますか? – user4584963

関連する問題