ipegasus
ipegasus

Reputation: 15242

How to save rails object from a JSON POST?

I would like to know how to save an object in rails 3 via a JSON POST?

The issue is that UsersController.rb doesn't recognize the JSON POST parameters and assumes there are no parameters in the request.

I have two create methods that do the same, just to debug the issue. Thanks in advance!

Routes.rb

post 'users'          => "users#create"
match 'users/create'  => "users#create_user", :via => [ :post]

User.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable,
         :validatable, :token_authenticatable #, :omniauthable

  has_many :leader_boards

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :authentication_token , :first_name, :large_profile_image_url, :last_name, :profile_image_url, :provider, :uid

  validates :email, :uniqueness => { :case_sensitive => false }
  validates :email, :first_name, :last_name, :presence => true
  validates :password, :password_confirmation, :presence => true
  validates :password, :length => { :minimum => 8 }

  def name
    return self.first_name.to_s + ' ' + self.last_name.to_s
  end
end

UsersController.rb

module Api
  module V1
    class UsersController < ApplicationController
      before_filter :authenticate_user!, :except => [:create, :show, :update, :create_user, :facebook,:leader_board]
      respond_to :json

      def create
        @user = User.create(params[:user])
        begin
          @user.reset_authentication_token!
        rescue

        end
        respond_with @user
      end

      def create_user
        begin
          @user = User.new
          @user.email = params[:email]
          @user.password  = params[:password]
          @user.password_confirmation   = params[:password_confirmation]
          @user.first_name = params[:first_name]
          @user.last_name  = params[:last_name]
          @user.save
        rescue

        end
        respond_with @user
      end

JSON POST

{ "email": "[email protected]", "first_name": "mike", "last_name": "jordan", "password": "jordanpass", "password_confirmation": "jordanpass" }

Response

{"errors":{"email":["can't be blank","can't be blank"],"password":["can't be blank","can't be blank","is too short (minimum is 8 characters)"],"first_name":["can't be blank"],"last_name":["can't be blank"],"password_confirmation":["can't be blank"]}}

Sample Post Alternative Screenshot

Upvotes: 0

Views: 1394

Answers (1)

Michelle Tilley
Michelle Tilley

Reputation: 159095

Your JSON post:

{ "email": "[email protected]", "first_name": "mike", "last_name": "jordan", "password": "jordanpass", "password_confirmation": "jordanpass" }

is not correct. Since the controller is looking for params[:user], your JSON should be:

{ "user" : { "email": "[email protected]", "first_name": "mike", "last_name": "jordan", "password": "jordanpass", "password_confirmation": "jordanpass" } }

Upvotes: 4

Related Questions