0

我有一个正在构建的音乐应用程序。我想以这样一种方式设置它,艺术家可以上传音乐文件,但在管理员批准文件以确保它不是垃圾邮件之前,它不会显示在索引页面上。我已将歌曲资源嵌套在用户资源下,并在成员上调用了批准,但出现以下错误。如果没有创建歌曲的管理员用户正在调用嵌套方法,我该如何调用它。

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 %>
4

1 回答 1

0

我想到了。由于它是我提到的嵌套资源,approve_user_song_path因此/users/:user_id/songs/:id/approve(.:format)它正在寻找,它将管理员作为用户user_id传递,但由于管理员不是创建歌曲的用户,因此出现错误。为了解决这个问题,我将用户和歌曲作为参数传递给了批准和拒绝方法。user_idid

所以在显示模板中它看起来像这样。

<% @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 的评论,我希望这可以帮助像我这样的 Rails 新手。:)

于 2013-07-03T15:54:31.733 回答