在嵌套资源上调用函数

时间:2013-07-02 23:47:36

标签: ruby-on-rails ruby-on-rails-3.2 nested-resources

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

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

1 个答案:

答案 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的评论,我希望这能帮助其他像我这样的新手。 :)