我正在制作一个音乐应用程序。我想以这样的方式设置它,即艺术家可以上传音乐文件,但在管理员批准文件以确保它不是垃圾邮件之前,它不会显示在索引页面上。我已经在用户资源下嵌套了歌曲资源,并在成员上调用了批准,但我收到以下错误。如果由未创建歌曲的管理员用户调用方法,如何在嵌套上调用方法。
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 %>
答案 0 :(得分:0)
我明白了。由于它是我提到的嵌套资源,approve_user_song_path
为/users/:user_id/songs/:id/approve(.:format)
所以它正在寻找user_id
,它会将管理员user_id
作为用户id
传递但由于管理员不是创建歌曲的用户,因此存在错误。为了解决这个问题,我将用户和歌曲作为参数传递给了批准和拒绝方法。
所以在show模板中它看起来像这样。
<% @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.id%></p>
<%= song.user_id %>
<%= song.current_state %>
<%= link_to "Approve", approve_user_song_path(song.user, song) %> |
<%= link_to "Decline", decline_user_song_path(song.user, song) %>
<% end %>
这让它工作了,感谢@mbratch的评论,我希望这能帮助其他像我这样的新手。 :)