【问题标题】:What's the proper way/syntax to access Active Record nested objects through the frontend's fetch request?通过前端的获取请求访问 Active Record 嵌套对象的正确方法/语法是什么?
【发布时间】: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.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 但没有其他名称(用于艺术家和流派)发布。我只是停留在这一点上,所以任何指导表示赞赏。

    标签: javascript ruby activerecord associations fetch-api


    【解决方案1】:

    在这种情况下,我会使用强参数。

    您可以在获取正文中使用:

    body: JSON.stringify({
      name: songName,
      year: year,
      artist_attributes: {
        name: artistName
      },
      genre_attributes: {
        name: genreName
      }
    })
    

    在你的控制器中:

    song = Song.create(song_params).to_json
    
    private
    
    def song_params
      params.require(:song)permit(:name, :year, artist_attributes:
                                  [:name], genre_attributes: [:name])
    

    如果你想直接从参数访问,你应该使用params['artist']['name']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多