So I have a posts
scaffold generated in a Rails app and I've added an upvote
and downvote
column to the post model. I added an "upvote" button on the view file and I need to make an AJAX call and query the database when you hit the upvote button, but the upvote button has no real Rails <form>
attached to it. How can I make this AJAX call and add the upvote to the database for the upvoted post?
When I make this AJAX call:
$('.up,.down').click(function(){
$.ajax({
type: 'POST',
url: '/posts',
dataType: 'JSON',
data: {
post: {
upvote: 1
}
},
success: function(){
alert('success')
}
});
});
It returns a 500 error. Where do I go form here?
You could use the :remote => true
attribute on the link_to
helper
for example:
<%= link_to post_upvote_path(post), :remote => true, :method => "put" %>
<%= link_to post_downvote_path(post), :remote => true, :method => "put" %>
then in config/routes.rb
:
resources :posts do
put "upvote", :to => "posts#upvote", as: :upvote
put "downvote", :to => "posts#downvote", as: :downvote
end
then handle the voting in your posts controller, like you probably already are and grab the post id with params[:id]
in the action
Here is an intro to rails flavored unobtrusive javascript
Update
To see the upvote and downvote routes that were created, go to the terminal and type
rake routes | grep vote
this will give you a list of all of your routes that have "vote" in the name. Or just type rake routes
to get a list of all of them. The first column is the named route, just append '_path' to the end of it to use it in your app - like post_upvote_path
above would be seen as
post_upvote PUT /posts/:id/upvote(.:format) posts#upvote
And in you PostsController you would want these actions:
class PostsController < ApplicationController
###
# index, show... other RESTful actions here
###
def upvote
@post = Post.find params[:id]
# code for however you are voting up the post here
end
def downvote
@post = Post.find params[:id]
# code for however you are voting down the post here
end
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With