Rails:仅返回json

In my app there is a list of items which you can upvote. I want to make these votes with AJAX calls.

This is the view:

<ul class="list-groups">
<% @questions.each do |question| %>
    <li class="list-group-item">
    <%= link_to question.description, question_path(question) %>
    <%= form_for(question, :url => url_for(:controller => 'vote', :action => 'vote'), method: :post, html: { class: 'form-inline' }) do |f| %>
      <%= f.submit 'Up vote', class: "btn btn-default" %>
      <%= f.hidden_field :id, :value => question.id %>
    <% end %>
  </li>
<% end %>
</ul>

And this the method that does it:

class VoteController < ApplicationController
respond_to :json

    def vote
        question_id = params[:question][:id]
        user_id = current_user.id
        vote = Vote.where(["question_id = :q", { q: question_id }]).where(["user_id = :u", { u: user_id }])
        respond_to do |format|
            if vote.nil?
                @vote = Vote.new
                @vote.question_id = question_id
                @vote.user_id = user_id
                @vote.save
                format.html { render '/home/index' }
                format.json { render :json => { :status => 'ok' } }
            else
                format.html { render '/home/index' }
                format.json { render :json => { :status => 'failed', :msg => 'You already voted' } }
            end
        end
    end
end

If I don't include this format.html { render '/home/index' } I am getting this error:

ActionController::UnknownFormat in VoteController#vote

But I don't want to render the page again, I am just loading the pieces of html that will change after the action with jQuery and ajax.

How can I respond only with the json?

Use respond_with instead of respond_to in your controller action.

respond_with do |format|

respond_to at the top of your controller is designed to work with respond_with in your controller action, whereas respond_to in your controller action ignores the respond_to that you've defined at the top of your controller.

Also make sure you are making a remote call, instead of a normall one if you want your request to go through AJAX.

<%= form_for(question, :url => url_for(:controller => 'vote', :action => 'vote'), method: :post, remote: true, html: { class: 'form-inline' }) do |f| %>

Note the remote: true part that is added as an argument to the form_for helper.

You need to include remote: true in form_for in order to make the call requests AJAX instead of HTML.

<%= form_for(question, :url => url_for(:controller => 'vote', :action => 'vote'), remote: true, method: :post, html: { class: 'form-inline' }) do |f| %> 

Check out the Working with JavaScript in Rails documentation for more information.