我有一个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,我会得到适当的结果;所以我又回到假设我遵循的方法是非常不正确的。
发布于 2018-04-12 04:00:20
您需要使用ActiveModelSerializers (AMS)来基于类的实例序列化您的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字符类的AMS类应该是这样的
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我将根据您的信息更新重构的模型类。希望这能帮上忙。
https://codereview.stackexchange.com/questions/191831
复制相似问题