簡體   English   中英

通過前端的 fetch 請求訪問 Active Record 嵌套對象的正確方法/語法是什么?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM