Модель Ассоциации (рельсы 5 по API)


У меня есть Character модель, которая имеет CharClass и ClassPerks ребенка.

В настоящее время я дублировать большое моей логике путем присвоения данных вручную.

Мой Character индекс и создать:

def index

    @campaign = Campaign.find_by_id(params[:campaign_id])
    @characters = @campaign.characters
    render json: {
        characters: @characters
    }
end

def create
    @campaign = Campaign.find_by_id(params[:campaign_id])
    @charClass = CharClass.find_by_id(params[:character_char_class_id])
    @character = @campaign.characters.new(character_params)
    @character.char_class_id = params[:character_char_class_id]

    if @character.save!
        render status: 201, json: {

            message: "Successfull added this character to the campaign!",
            character_name: @character.character_name + ' the ' + @charClass.class_name,
            character_class: @charClass.class_name,
            character_level: @character.character_level,
            character_experience: @character.character_experience,
            character_gold: @character.character_gold,
            character_perks: get_names(@character.character_perks),
            character_image: @character.character_image

        }
    else
        render status: 404, json: {
            message: "Something went wrong: Check line 24 of the Character Controller"
        }
    end
end

Я вручную назначить character_class и character_image несмотря на оба эти всегда одинаково на основе их character_class.

Внутри character.rb я делаю это, чтобы назначить их после создания:

    after_create :add_perks, :save_class

    def add_perks
        self.class_perks.each do |perk|
            self.character_perks.create(class_perk_id: perk.id)
        end
    end


    def save_class()
        case self.char_class_id
            when 1 # Mindthief
                self.character_image = "https://gloomhavenil.files.wordpress.com/2017/12/11849117_616974988445216_217288420_n.jpg?w=480"
                self.character_class = "Mindthief"
                self.save
            when 2 # Tinkerer
                self.character_image = "http://www.cephalofair.com/wp-content/uploads/2015/04/Quatryl-Tinkerer.jpg"
                self.character_class = "Tinkerer"
                self.save
            # when 'Sawbones'
            # else
        end
    end
end

Это работает, но я не уверен, как это сделать лучше/правильно. Я удалены ненужные поля, но вы увидите, я имею отношения настроены соответствующим образом.

  create_table "char_classes", force: :cascade do |t|
    t.string "class_name"
    t.string "class_image"
    t.string "class_perks"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

 create_table "characters", force: :cascade do |t|
    t.string "character_class"
    t.string "character_image"
    t.integer "char_class_id"
    t.index ["campaign_id"], name: "index_characters_on_campaign_id"
    t.index ["char_class_id"], name: "index_characters_on_char_class_id"
  end

Я могу сделать Character.first.char_class.class_name и я буду получать соответствующий результат; поэтому я вернулся к исполнению этот метод я очень некорректно.



186
3
задан 12 апреля 2018 в 12:04 Источник Поделиться
Комментарии
1 ответ

Вам нужно использовать ActiveModelSerializers (АМС) для сериализации в JSON ответы, основанные на экземпляры класса.

class CampaignsController < ApplicationController
def index
render json: { characters: campaign.characters }
end

def create
@character = campaign.characters.new(character_params.merge(char_class_id: char_class.id))

if @character.save!
render json: @character, serializer: CharacterSerializer, status: 201 # This should automatically be formatted by AMS
else
not_found('Something went wrong: Check line 24 of the Character Controller')
end
end

private

def campaign
@campaign ||= Campaign.find_by_id(params[:campaign_id])
end

def char_class
@charClass ||= CharClass.find_by_id(params[:character_char_class_id])
end
end

Это как АМС класс для класса персонажа должны выглядеть

class CharacterSerializer < ActiveModel::Serializer
attributes :message, :character_name, :character_class, :character_level, :character_experience, :character_gold, :character_perks, :character_image

def message
'Successfull added this character to the campaign!'
end

def character_name
return object.character_name + ' the ' + character_class # check the associations
end

def character_class
object.charClass.class_name
end

def character_perks
# Unsure what this get names methods does so im leaving it for you to refactor
get_names(object.character_perks),
end

end

Также добавьте в ApplicationController

class ApplicationController < ActionController::Base

# Add this to your application controller

def not_found(message = nil)
render json: { message }, status: 404
end

end

Я буду обновлять рефакторинг модели класса только на основе вашей информации. Надеюсь, что это помогает сейчас.

0
ответ дан 12 апреля 2018 в 04:04 Источник Поделиться