【发布时间】:2013-07-02 23:47:36
【问题描述】:
我正在构建一个音乐应用程序。我想以这样一种方式设置它,艺术家可以上传音乐文件,但在管理员批准文件以确保它不是垃圾邮件之前,它不会显示在索引页面上。我已将歌曲资源嵌套在用户资源下,并在成员上调用了批准,但出现以下错误。如果没有创建歌曲的管理员用户正在调用嵌套方法,我该如何调用它。
ActiveRecord::RecordNotFound in SongsController#approve
Couldn't find Song with id=1
app/controllers/songs_controller.rb:35:in `approve'
歌曲id其实是13。
歌曲控制器中的批准功能:
def approve
@song = Song.find(params[:id])
@song.accept
#UserMailer.invitation_confirmation.deliver
redirect_to :back, :only_path => true, :success => "Sent approval for #{@song.title} to #{@song.user.name} at #{@song.user.email}."
end
在用户控制器中显示我的操作
def show
@songs = Song.all
@user = User.find(params[:id])
end
在路由文件中:
resources :users do
resources :songs do
get 'approve', on: :member
get 'decline', on: :member
end
end
在我的管理仪表板视图中
<% if @user.admin? %>
<% @songs.each do |song| %>
<%= image_tag song.artwork_url(:thumb) if song.artwork? %>
<h4>Title</h4><p><%= song.title %></p>
<h4>Album</h4><p><%= song.album %></p>
<p><%= song.current_state %></p>
<%= link_to "Approve", approve_user_song_path(song) %> |
<%= link_to "Decline", decline_user_song_path(song) %>
<% end %>
<% end %>
【问题讨论】:
-
您的管理仪表板视图中的
@songs来自哪里?是来自SongActiveRecord 的集合吗? -
是的,它是网站上艺术家创作的所有歌曲的索引。我忘记添加显示此内容的用户控制器中的代码,但现在已添加。
-
我还不明白为什么这不起作用。在您的视图中(您显示标题、专辑等的位置),您是否添加了一个额外的测试字段以显示
id以确认在这种情况下它是 13? (例如,<p>Id = <%= song.id %></p>) -
@mbratch,我刚刚这样做了,它显示了正确的歌曲 ID。我认为的问题是,由于它是嵌套资源
approve_user_song GET /users/:user_id/songs/:id/approve(.:format),:user_id被管理员user_id替换,因此它找不到调用approve 方法的歌曲,因为管理员没有创建歌曲 -
在这种情况下,您应该看到
/users/1/songs/13/approve的路径,但您看到的是/users/1/songs/1/approve?
标签: ruby-on-rails ruby-on-rails-3.2 nested-resources