[英]What's the proper way/syntax to access Active Record nested objects through the frontend's fetch request?
我有一个 React 前端和一个 Ruby Sinatra 后端。 我在后端有 4 个模型:这是我的 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
但我在通过 song 访问artist.name
时遇到了棘手的问题,即使他们有一个应该允许songs
访问此信息并发布它的关联。
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 但没有其他名称(用于艺术家和流派)发布。 我只是停留在这一点上,所以任何指导表示赞赏。
在这种情况下,我会使用强参数。
您可以在获取正文中使用:
body: JSON.stringify({
name: songName,
year: year,
artist_attributes: {
name: artistName
},
genre_attributes: {
name: genreName
}
})
在您的 controller 中:
song = Song.create(song_params).to_json
private
def song_params
params.require(:song)permit(:name, :year, artist_attributes:
[:name], genre_attributes: [:name])
如果你想直接从 params 访问,你应该使用params['artist']['name']
设法弄清楚这一点。 不确定这是否是最佳方式(可能不是),但据我所知,它确实有效。 为了后代的缘故,这里。
## post a new song
post "/songs" do
artist = Artist.find_or_create_by(name: (params[:artist][:name]))
genre = Genre.find_or_create_by(name: params[:genre][:name])
artist.update(
name: params[:artist][:name],
)
genre.update(
name: params[:genre][:name],
)
song = Song.create(
name: params[:name],
year: params[:year],
artist_id: artist.id,
genre_id: genre.id,
)
song.to_json(include: [:artist, :genre, :reviews])
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.