2016-09-14 1 views
0

私はRubyに戻って、単純な投票の上下システム(redditなど)を作成しようとしています。RubyでAjaxを使用する

私は投票権を得ることができますが、ページは毎回リロードされます。値を動的に変更するためにajax呼び出しを実装しようとしていますが、私が見つけることができる唯一のガイドはRails用です。私はSinatraサーバーでRubyを使用しています。

html.erb

<form action="/votes" method="post"> 
    <input type="hidden" name="post_id" value="<%= post.id %>"> 
    <button id="thumb-up"><img src="/images/thumbs-up.gif" /></button> 
    </form> 
    <p> <%= post.votes.count %> </p> 
    <form action="/votes" method="post"> 
    <input type="hidden" name="_method" value="delete"> 
    <input type="hidden" name="post_id" value="<%= post.id %>"> 
    <button id="thumb-down"><img src="/images/thumbs-down.gif" /></button> 
    </form> 

jqueryの

$('#thumb-up').on('click', function(e) { 
    e.preventDefault(); 

$.ajax({ 
    url: '/votes', 
    method: 'post', 
    success: function() { 
     console.log('vote up'); 
     $(this).html("<%= post.votes.count %>"); 
    } 
    }) 
}); 

モデル

class Vote < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :post 

    validates :post, uniqueness: { scope: :user } 
    validates :user, uniqueness: { scope: :post } 

end 

経路(申し訳ありませんが、後添加)

post '/votes' do 
    if logged_in? 
    vote = Vote.new 
    vote.user_id = current_user.id 
    vote.post_id = params[:post_id] 
    vote.save 
    redirect to '/' 
    else 
    redirect to '/session/new' 
    end 
end 

delete '/votes' do 
    if logged_in? 
    votes = Vote.where(user_id: current_user.id, post_id: params[:post_id]) 

    votes.each do |vote| 
     vote.delete 
    end 
    redirect to '/' 
    else 
    redirect to '/session/new' 
    end 
end 

今、私はこれは単純な単純なことだと思っています。私は遠隔操作を知っています:真実はそれと関係しています。

サム・アップ・ボタンでは500エラーが表示されますが、サム・ダウンでは表示されません。ポストではなくurl: 'delete'です。

ボタンごとにフォームを用意することなくこれを達成できますか?真手段

希望を「気に入っ」:

私は同じことに取り組んでいた
+1

ヒント:最初のajaxチュートリアルを調べて、構文<%= post.votes.count%>が導入されているものを探してみてください。 – 7stud

+0

'remote:true'はあなたのためにAjaxを行うRailsの便利なものです。 Sinatraには同等のものはありません。あなたは大部分が大丈夫ですが、軽微なエラー(概念の一部)があります。 「500」はサーバーコードのエラーを意味し、Sinatraルートを投稿していないので、そのことについては何も言えません。 @ 7studによると、あなたの '$(this).html'は、Ajaxレスポンスにあったもので、プレレンダリングされたもの(あるいはさらに悪いもの、未レンダリングされたもの)ではありません。 – Amadan

+0

*ボタンごとにフォームを用意する必要はありませんか?*はい。ボタンには、HTMLページにフォームが存在する必要はありません。ページ上にフォームがなくてもボタンをクリックすることができます。しかし、コードを使用してどのボタンがクリックされたかを識別できる必要があります。そのidをチェックすることで、サーバーにあなたのajaxリクエストで何をすべきかを伝えることができます。 – 7stud

答えて

-1

は、uはこの

<%= link_to image_tag(likepic), like_post_path(post,status: true), class: 'vote', method: :put, remote: true %> 

like_user_pathのように呼び出してその簡単なAjaxの場合は、ポストコントローラとポスト状態の方法「のように」に行きますそれは私のため

を働いていたので、それは、動作し、モデルが

class Like < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :post 
end 
+0

彼はレールを使用していないので、 'like_post_path'にはアクセスできません。 「remote:true」と同様に –

+0

ああ申し訳ありませんが、私は見ています – Bee

0

私はありますエラーがここにあると思う:

validates :post, uniqueness: { scope: :user } 

、ここ

$.ajax({ 
    url: '/votes', 
    method: 'post', 
    success: function() { 
     console.log('vote up'); 
     $(this).html("<%= post.votes.count %>"); 
    } 
    }) 

あなたの投票は郵便番号が必要ですが、あなたはあなたのAjaxリクエストで1を送信しません。

関連する問題