【发布时间】:2020-03-23 21:50:49
【问题描述】:
正在开发我的第一个 Rails 应用程序。 我有两个模型:专辑和曲目。
向专辑添加曲目时,我需要专辑 ID 才能保存。 我有一个collection_select,它可以拉出所有专辑并按降序列出它们的ID:
<%= form.collection_select :albums_id, Album.all.order(id: :desc), :id, :title, :include_blank => false %>
这工作正常,创建 html:
<select name="track[albums_id]" id="track_albums_id">
<option value="11">Eleventh Album Title</option>
<option value="10">Tenth Album Title</option>
...
</select>
但是当我尝试保存新记录时,我总是得到错误:
Album must exist
控制器有:
def create
@track = Track.new(track_params)
respond_to do |format|
if @track.save
format.html { redirect_to @track, notice: 'Track added.' }
format.json { render :show, status: :created, location: @track }
else
@page_title = 'ERROR - Add Track'
format.html { render :new }
format.json { render json: @track.errors, status: :unprocessable_entity }
end
end
end
而track_params指的是:
private
def track_params
params.require(:track).permit(:albums_id, :title, :track_number, :track_url)
end
型号:
专辑.rb
class Album < ApplicationRecord
has_many :tracks
validates :title, presence: true
validates :release_year, presence: true
has_one_attached :photo
end
track.rb
class Track < ApplicationRecord
belongs_to :album
validates :title, presence: true
validates :track_number, presence: true
validates :track_url, presence: true
end
routes.rb
Rails.application.routes.draw do
resources :tracks
root 'pages#about'
get 'signup', to: 'users#new', as: 'signup'
get 'login', to: 'sessions#new', as: 'login'
get 'logout', to: 'sessions#destroy', as: 'logout'
get 'contact', to: 'messages#new', as: 'contact'
get 'sessions', to: 'sessions#new'
get 'dashboard', to: 'pages#dashboard', as: 'dashboard'
resources :videos
resources :gigs
resources :photos
resources :albums
resources :users
resources :groups
resources :messages
resources :sessions, only: [:new, :create, :destroy]
post "/delayed_job" => DelayedJobWeb, :anchor => false
end
接受除:albums_id 之外的所有值。 collection_select 中的选定值始终被忽略并触发阻止保存轨道的错误。
albums_id 是数据库列名,由 rails 作为belongs_to: albums 的结果创建。
我做错了什么?
更新:迁移
...create_albums.rb:
class CreateAlbums < ActiveRecord::Migration[5.2]
def change
create_table :albums do |t|
t.string :artist
t.string :copyright
t.string :title
t.date :release_year
t.text :comment
t.timestamps
end
end
end
...create_tracks.rb:
class CreateTracks < ActiveRecord::Migration[5.2]
def change
create_table :tracks do |t|
t.belongs_to :albums
t.string :title
t.integer :track_number, :default => 1
t.string :track_url
t.timestamps
end
end
end
【问题讨论】:
-
您是否在某处关联记录?请显示您的模型文件和您的 routes.rb 文件。
-
@hashrocket 已添加到问题中。
-
您确定数据库列名为
albums_id。看起来应该叫album_id。 -
绝对叫album_id。我检查了 mysql CLI,如果我在没有复数词的情况下尝试它,我会收到
unknown column类型错误。 -
可以粘贴专辑和曲目的数据库迁移文件吗?理想情况下,您的模型应该是单数的,因此您生成像 rails g model Album 和 rails g model Track 这样的模型,rails 创建复数 db 表,它们是曲目和专辑。您的迁移文件中一定有问题。请分享一下
标签: controller ruby-on-rails-5 rails-activerecord