dabadaba
dabadaba

Reputation: 9512

json data not being passed in Rails

I am trying to make a very simple ajax call with Rails 4, but the json response is not being retrieved properly.

Here's the script:

$(document).on "submit", "form[name=upvote-form]", ->
  form = $(this)
  $.post "/vote", $(this).serialize(), (data) ->
    if data["status"] is true
      form.find("input").addClass "disabled"
      $("#vote-count-".concat(form.find("#question_id").attr("value"))).html data["votes"]
    else

    return

  return

alert(data['votes']) is undefined, which made me try to find what was going wrong.

Then in the console I could see this:

ArgumentError (Nil location provided. Can't build URI.):
  app/controllers/vote_controller.rb:8:in `vote'

And here's the method with the problem:

class VoteController < ApplicationController

    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 }]).take
        respond_to do |format|
            if vote.nil?
                @vote = Vote.new
                @vote.question = Question.find question_id
                @vote.user = User.find user_id
                @vote.save
                votes = Vote.where(["question_id = :q", { q: question_id }]).count
                format.json { render :json => { status: true, votes: votes } }
            else
                format.json { render :json => { status: false } }
            end
        end
    end
end

Any clue of what's going wrong? And what can I do?

Upvotes: 0

Views: 50

Answers (1)

Bart Jedrocha
Bart Jedrocha

Reputation: 11570

respond_with is meant to be used with a resource. Example

def show
  @vote = Vote.find params[:id]
  respond_with(@vote)
end

In your case, you need to use the respond_to method

def vote
  # stuff
  respond_to do |format|
    if vote.nil?
      # stuff
      format.json { render json: { status: true, votes: votes } }
    else
      # other stuff
    end
  end
end

Upvotes: 1

Related Questions