2013-11-27 80 views
0

我有以下代码这给我一个ActionView::Template::Error (undefined method roster_path”为#<#:0x007fe34005c208>):`删除HABTM对象

虽然在后台它删除关联player_roster(有和属于多个),但是当我按下链接时我想删除它。

名册的路径嵌套在一个团队内,但问题是关于名册和球员。

<%= form_for [@team, @roster] do |f| %> 
    <% @players.each do |player| %> 
     <%= player.gamertag %> 
     <%= link_to "Delete", player.rosters.delete(@roster) %> 
    <% end %> 
<% end %> 

:更新

Player.rb

class Player < ActiveRecord::Base 
    has_and_belongs_to_many :rosters 
    belongs_to :country 

    mount_uploader :picture, PictureUploader 
end 

Roster.rb

class Roster < ActiveRecord::Base 
    has_and_belongs_to_many :players 
    has_many :placements 

    belongs_to :team, touch: true 
end 
+0

你有什么关系,就像在你的模型?删除发生的方式是使用'dependent::destroy',但除非你发布了模型代码,否则我们不知道:) –

+0

用两种模型更新我的问题:) – Pierre

回答

0

你正在做的,现在会打电话给你delete在页面加载时的方式。您不能链接到任意的Ruby代码,您需要链接到执行您的逻辑的路由和控制器操作。

<%= form_for [@team, @roster] do |f| %> 
    <% @players.each do |player| %> 
     <%= player.gamertag %> 
     <%= link_to "Delete", player_roster_path(player, @roster), method: :delete %> 
    <% end %> 
<% end %> 

这个链接将路线的玩家/:ID /名册/:ID和DELETE HTTP动作,这Rails会路线destroy方法。

class RostersController < ApplicationController 

    def destroy 
    @player = Player.find(params[:player_id]) 
    @roster = Roster.find(params[:id]) 
    @player.rosters.destroy(@roster) 
    # redirect/render 
    end 

end 

您还需要设置player_roster_path在配置路由/ routes.rb中

resources :players do 
    resources :rosters, only: [:destroy] # you may have other routes here as well 
end 
+0

我已经有一个破坏函数对于RostersController中的名册本身,我可以将它命名为其他内容并更改链接中的方法以匹配函数吗?谢谢 – Pierre

+0

通常情况下,您可以先检查是否存在'@ player',如果是,则删除该玩家的名单(连接表),否则删除名册本身。如果这对您的应用程序没有意义,那么您可以制定新的方法。像'删除'或其他东西,表明你正在从名册中删除一名球员。请参阅'link_to'文件,这非常简单。 –