API Rest

Hej,
Jak zawsze ja i moja zielona głowa…
Zrobiłem API do mojej aplikacji

Model User
http://localhost:3000/api/v1/user

Gdy wykorzystuje to w postmanie i staram się dodać za pomocą jsona nowego użytkownika

[
    {
        "login": "Januszweweqw",
        "email": "Janusz@gmail.com",
        "male": "Man",
        "spam": true,
        "localizex": "41.878114",
        "localizey": "-87.629798",
        "created_at": "2016-08-12T22:02:40.000Z",
        "updated_at": "2016-08-13T02:59:32.000Z"
    }
]

dodaje mi się wyłącznie pusty rekord…

API wygląda następująco

module Api
module V1
class UserController < ApplicationController
respond_to :json

  def index
    respond_with User.all
  end
  def show
    respond_with User.find(params[:id])
  end
  def create
    respond_with User.create(params[:user])
  end
  def update
    respond_with User.update(params[:id], params[:user])
  end
  def destroy
    respond_with User.destroy(params[:id])
  end
end

end
end

Pomożecie ?

Hej,
Obstawiałbym to, że w params[:user] nic nie masz.
Owiń sobie w postmanie to co masz w user’a.
np:

{ user: { "login": "Januszweweqw", "email": "Janusz@gmail.com", "male": "Man", "spam": true, "localizex": "41.878114", "localizey": "-87.629798", "created_at": "2016-08-12T22:02:40.000Z", "updated_at": "2016-08-13T02:59:32.000Z" } }

Dalej nic…

W konsoli dostaję

Started POST “/api/v1/user” for ::1 at 2016-08-18 09:26:47 +0200
Processing by Api::V1::UserController#create as JSON
(0.2ms) BEGIN
SQL (0.7ms) INSERT INTO users (created_at, updated_at) VALUES (‘2016-08-18 07:26:47’, ‘2016-08-18 07:26:47’)
(1.7ms) COMMIT
[active_model_serializers] Rendered ActiveModel::Serializer::Null with User (0.3ms)
Completed 201 Created in 15ms (Views: 1.0ms | ActiveRecord: 2.6ms)

IMO, jak nic, masz puste wartości w params[:user]. Wartości zapisane w bazie to tylko postawione z AR(?) timestamps. (Automatycznie ustawiane created_at, updated_at)

Polecam sobie zrzucić params do logów:

Logger.info params

albo użyć jakiegoś gem’a do debugowania:


Wtedy będziesz wiedzieć co masz w params’ach, co wysyłasz w request’cie wiesz.
Jedyne co musisz naprawić to podstawić do dobrze parametry.
Dobrze by też było dodać do tego strong parameters i nie przyjmować wszystkiego co przyjdzie jak leci :slight_smile:

Hej udało mi się ,jednak potrzebuje rzucić errorem np 200 kiedy dany użytkownik już jest gdy chce go stworzy przez API

200 to nie kod błędu, a ok domyślny kod powodzenia. Domyślny kod dla każdej akcji GET.

OK to chodzi o to aby rzucało błąd gdy dany użytkownik jest już w bazie danych

poczytaj: http://edgeapi.rubyonrails.org/classes/ActionController/Responder.html jest dobrze napisane i powinieneś znaleźć odpowidź na swoje pytanie.

OK udało się jednak mam jeszcze jeden problem…

def create
respond_to do |format|

            format.json { 
                      if User.exists?(login: params[:login])
                         render :nothing => true, :status => 400, :content_type => 'text/html'
                         else 
                          User.create(params_user)
                         render :nothing => true, :status => 201, :content_type => 'text/html'
                        end
                        }
                      
          end
      end

mam również funkcję params_user

      def params_user
        params.require(:user).permit(:login,:email,:password,:spam,:male)
      end

I otrzymuje błąd
param is missing or the value is empty: user
w linii

params.require(:user).permit(:login,:email,:password,:spam,:male)

obrazek z błędem nie wyświetla się

Zmieniłem na cytat zamiast obrazka.

nie przesyłasz danych w namespacie :user

Innymi słowy json który wysyłasz wygląda zapewne tak:

{login:'login',email:'email@example.com'}

zamiast:

{user:{login:'login',email:'email@example.com'}}

W kontrolerze można jeszcze użyć wrap_parameters, jeśli nie chcesz zmieniać tego jsona