【发布时间】:2022-08-18 18:53:37
【问题描述】:
我有一个 React 前端和一个 Ruby Sinatra 后端。我在后端有 4 个模型:here\'s my ERD。简而言之,以下是重要的关联:
class Artist < ActiveRecord::Base
has_many :songs
has_many :genres, through: :songs
has_many :reviews, through: :songs
accepts_nested_attributes_for :genres, :songs
end
class Genre < ActiveRecord::Base
has_many :songs
has_many :artists, through: :songs
has_many :reviews, through: :songs
accepts_nested_attributes_for :artists, :songs
end
class Song < ActiveRecord::Base
has_many :reviews
belongs_to :artist
belongs_to :genre
accepts_nested_attributes_for :genre, :artist, :reviews
end
我现在的问题主要是语法以及如何访问我的 fetch 请求正文中的嵌套(隐含)对象,以及如何在后端访问它。例如,song.artist.name 将导致artist.name,但我在通过songs 访问artist.name 时遇到了麻烦,即使他们有一个应该允许歌曲访问此信息并发布它的关联。
post \"/songs\" do
# artist_id = Artist.find_by(name: params[:artistName]) || Artist.create(name: params[:artistName]),
# genre_id = Genre.find_by(name: params[:genreName]) || Genre.create(name: params[:genreName]),
# thisArtist = Artist.find_or_create_by(name: params[:artistName]),
# thisGenre = Genre.find_or_create_by(name: params[:genreName]),
# this_artist = Artist.find_or_create_by(name: params[:artistName]),
# this_genre = Genre.find_or_create_by(name: params[:genreName])
song = Song.create(
name: params[:name],
year: params[:year],
artist_attributes: [name: params[:artistName]],
genre_attributes: [name: params[:genreName]],
)
song.to_json
end
在前端,我从他们提供song.name、artist.name、genre.name 和song.year 的表单中提取用户数据——
function submitNewSong({songName, year, artistName, genreName}) {
fetch(`http://localhost:9292/songs`, {
method: \"POST\",
headers: {
\"Content-Type\": \"application/json\",
\"Access-Control-Allow-Origin\": \"*\",
},
body: JSON.stringify({
name: songName,
year: year,
artist: {
name: artistName
},
genre: {
name: genreName
}
}),
})
.then((r) => r.json())
.then((data) => console.log(data))
我知道这是不对的,这就是为什么我在干净地发布信息时遇到问题。我得到的最接近的是songName(通过前端)将自己发布到 song.name 但没有其他名称(用于艺术家和流派)发布。我只是停留在这一点上,所以任何指导表示赞赏。
标签: javascript ruby activerecord associations fetch-api