我有一个深层嵌套的资源。目前一切正常,除非我创作一首歌。由于某种原因,它不会将ARTIST_ID存储在数据库中(显示为NIL)。有人可以帮助我,我是新手。
第一个嵌套将ARTIST_ID存储在ALBUMS表中......
的routes.rb
resources :artists do
resources :albums do
resources :songs
end
end
SONGS_CONTROLLER
class SongsController < ApplicationController
respond_to :html, :js
def index
@artist = Artist.find(params[:artist_id])
@album = Album.find(params[:album_id])
@songs = @album.songs.all
end
def create
@artist = Artist.find(params[:artist_id])
@album = Album.find(params[:album_id])
@song = @album.songs.create(params[:song])
if @song.save
redirect_to artist_album_songs_url
flash[:success] = "Song Created."
else
render 'new'
end
end
def new
@artist = Artist.find(params[:artist_id])
@album = Album.find(params[:album_id])
@song = Song.new
end
end
模型
class Artist < ActiveRecord::Base
attr_accessible :name
has_many :albums
has_many :songs
end
class Album < ActiveRecord::Base
attr_accessible :name, :artist_id
belongs_to :artist
has_many :songs
end
class Song < ActiveRecord::Base
attr_accessible :name, :album_id, :artist_id
belongs_to :albums
end
查看(创作,歌曲)
<div class="container-fluid">
<div class="row-fluid">
<%= form_for ([@artist,@album, @song]), :html => { :multipart => true } do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.text_field :name, placeholder: "name", :class => "input-xlarge"%>
<%= f.submit "Create Song", class: "btn btn-primary"%>
<% end %>
</div>
</div>
答案 0 :(得分:1)
看起来您似乎没有在任何地方为歌曲设置artist_id。你正在这样做 - 使用album_id和artist_id,你必须选择其中一个作为父母。这就像你在歌曲上缓存artist_id一样。
我想我会保留你正在做的事情但是把它添加到模型中。
class Song < ActiveRecord::Base
before_save :ensure_artist_id
def ensure_artist_id
self.artist_id = self.album.artist_id
end
end
另一种选择是明确地在控制器中设置它
def create
@artist = Artist.find(params[:artist_id])
@album = Album.find(params[:album_id])
@song = @album.songs.create(params[:song].merge(:artist_id => @artist.id)
if @song.save
redirect_to artist_album_songs_url
flash[:success] = "Song Created."
else
render 'new'
end
end
但是感觉不干净,可能会在其他控制器方法中重复。在模型中使用它会更好。