Reputation: 15242
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
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