В Rails, почему я получаю ответ 204 - No Content для моего обновления/PATCH/PUT, используя Active Model Serializers?

Этот код предназначен для списка пользователей (пользователь может создать список дел пользователя). Этот конкретный ресурс содержит не элементы списка, а только заголовок списка и тип списка.

class Api::V1::UserListsController < ApplicationController
    respond_to :json
    skip_before_filter :verify_authenticity_token

    def index
        if authenticate_user
            user_lists = @current_user.user_lists
            if user_lists
                respond_with user_lists, each_serializer: Api::V1::UserListSerializer
            else
                render json: { error: "Could not find user's lists."}, status: :not_found
            end 
        else
            render json: { error: "User is not signed in." }, status: :unauthorized
        end     
    end         

    def show
        if authenticate_user
            user_lists = @current_user.user_lists
            user_list = user_lists.find_by_id(params[:id])
            if user_list
                respond_with user_list, serializer: Api::V1::UserListSerializer
            else
                render json: { error: "Could not find user's list."}, status: :not_found
            end 
        else
            render json: { error: "User is not signed in." }, status: :unauthorized
        end     
    end     

    def create
        if authenticate_user
            user_list = @current_user.user_lists.new(user_list_params)
            if (user_list.save!)
                respond_with :api, :v1, @current_user, user_list, serializer: Api::V1::UserListSerializer
            else
                render json: { error: "Could not create new User List."}, status: :unprocessable_entity
            end         
        else
            render json: { error: "User is not signed in." }, status: :unauthorized
        end
    end

    def update
        if authenticate_user
            user_list = @current_user.user_lists.find_by_id(params[:id])

            if (user_list.update_attributes(user_list_update_params))
                respond_with :api, :v1, @current_user, user_list, serializer: Api::V1::UserListSerializer                                  
                                    #respond_with user_list, serializer: Api::V1::UserListSerializer
            else
                render json: { error: "Could not update User List." }, status: :unprocessable_entity
            end
        end
    end

    private

        def user_list_params
            params.require(:user_list).permit(:user_id, :type_id, :title)
        end

        def user_list_update_params
            params.require(:user_list).permit(:type_id, :title)
        end
end

Теперь обновление работает, когда я PUT/PATCH... но я получаю

Completed 204 No Content in 24ms (ActiveRecord: 4.3ms)

Прошло около 4+ месяцев с тех пор, как я делал какие-либо рельсы, и тогда я только начинал их изучать.

1) Кто-нибудь знает, почему мне ничего не возвращают? Я знаю, что это как-то связано с моей строкой кода response_with в обновлении, но я не уверен, что именно.

2) Может ли кто-нибудь объяснить мне разницу между SHOW response_with и CREATE response_with. Я помню, что у меня была проблема с пониманием этого тогда и, очевидно, сейчас.

ПОКАЗЫВАТЬ

respond_with user_list, serializer: Api::V1::UserListSerializer

СОЗДАЙТЕ

respond_with :api, :v1, @current_user, user_list, serializer: Api::V1::UserListSerializer

a) Почему сначала для создания требуется :api и :v1, а для показа — нет?

b) Почему для create требуется @current_user, а для show нет?

Приложение: вот мой сериализатор для справки

class Api::V1::UserListSerializer < ActiveModel::Serializer
  attributes :id, :user_id, :type_id, :title
  has_many :items, embed: :ids
end

person chris P    schedule 14.10.2014    source источник
comment
Этот вопрос может вам помочь: рельсы, которые избегают 204 от put"> stackoverflow.com/questions/9953887/   -  person Passalini    schedule 05.01.2016


Ответы (4)


Я знаю, что это на 2 года позже, но после некоторых копаний я обнаружил, что пустой ответ с 204 является преднамеренным (как упоминалось выше). Если вы используете respond_with, так будет всегда. В качестве обходного пути можно было бы использовать вместо этого render (пример ниже):

class Api::V1::ItemsController < ApplicationController
  respond_to :json
  ...

  def update
    @item = Item.find(params[:id]
    if @item
      @item.update_attribute(item_params)
      render json: @item
    end
  end
  ...
end
person Alan Smith    schedule 07.12.2016

Вы не должны получать ничего, кроме ошибки 204. Любому интеллектуальному клиенту не нужно получать назад данные, которые он только что отправил вам — ему нужно только подтверждение того, что данные были сохранены.

person Brandon    schedule 27.11.2014
comment
А как насчет глупых клиентов? Не надо различать по интеллекту :) - person Sergio Tulentsev; 27.11.2014
comment
Кажется, что Rails не отправляет ответ json при вводе. - Это сработало для меня с Netflix/fast_jsonapi - person Brent Greeff; 15.02.2019

Не передавайте по ошибке свой класс Api::V1::UserListSerializer как пару ключ/значение (форма хэша). Вы получите сообщение об ошибке с текстом необходим класс или модуль. Это должно выглядеть так:

serialize :some_array, Api::V1::UserListSerializer

Или, может быть, понятнее было бы:

serialize(:some_array, Api::V1::UserListSerializer)

Вы пропускаете один параметр, и вы визуализируете класс объекта без содержимого: 204 - No Content Это может показаться очевидным, но обычно существует привычка передавать вещи в виде пары ключ/значение.

Одно улучшение:

before_action :authenticate_user, only: [:create, :show, :update, ...]

https://apidock.com/rails/ActiveRecord/Base/serialize/class

person maguri    schedule 13.12.2017

person    schedule
comment
Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную немедленную помощь. правильное объяснение значительно улучшит его долгосрочную ценность, показав, почему это хорошее решение проблемы и сделать его более полезным для будущих читателей с другими, похожими вопросами. Пожалуйста, отредактируйте свой ответ, чтобы добавить некоторые пояснения, включая сделанные вами предположения. - person Donald Duck; 14.12.2017