繁体   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