【问题标题】:Calling A Function on a Nested Resource在嵌套资源上调用函数
【发布时间】: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? (例如,&lt;p&gt;Id = &lt;%= song.id %&gt;&lt;/p&gt;
  • @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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢编辑我最初问题的人,我应该阅读它的语法错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多