[英]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.