私は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'
です。
ボタンごとにフォームを用意することなくこれを達成できますか?真手段
希望を「気に入っ」:
私は同じことに取り組んでいた
ヒント:最初のajaxチュートリアルを調べて、構文<%= post.votes.count%>が導入されているものを探してみてください。 – 7stud
'remote:true'はあなたのためにAjaxを行うRailsの便利なものです。 Sinatraには同等のものはありません。あなたは大部分が大丈夫ですが、軽微なエラー(概念の一部)があります。 「500」はサーバーコードのエラーを意味し、Sinatraルートを投稿していないので、そのことについては何も言えません。 @ 7studによると、あなたの '$(this).html'は、Ajaxレスポンスにあったもので、プレレンダリングされたもの(あるいはさらに悪いもの、未レンダリングされたもの)ではありません。 – Amadan
*ボタンごとにフォームを用意する必要はありませんか?*はい。ボタンには、HTMLページにフォームが存在する必要はありません。ページ上にフォームがなくてもボタンをクリックすることができます。しかし、コードを使用してどのボタンがクリックされたかを識別できる必要があります。そのidをチェックすることで、サーバーにあなたのajaxリクエストで何をすべきかを伝えることができます。 – 7stud