如何通过选定用户的关联来销毁has_many:

时间:2016-04-05 22:50:12

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我有一组用户。用户创建组并且是所有者。他们可以接受/拒绝请求(工作正常),创建组(也可以工作),我希望他们能够删除组成员(不起作用)。出于某种原因,该组的所有者都可以从该组中删除。

如何设置控制器操作/视图以让所有者删除组成员?

P.S。我不想为此使用授权系统。它应该很简单,只需在控制器中完成。我只需要能够删除任何组成员。 群组= Cliqs。我没有将会员资格作为群组的嵌套资源。

错误:无法找到CliqMembership,其中'id'= 2 [WHERE cliq_membershipsuser_id =?]

这是我的控制器动作:

def destroy
  @cliq = Cliq.find_by(params[:cliq_id])
  @cliq_membership = @cliq.cliq_memberships.find(params[:id])

  @cliq_membership.destroy
  redirect_to cliqs_path
end

我的模特:

class Cliq < ActiveRecord::Base
  belongs_to :owner, class_name: 'User'

  has_many :cliq_memberships, dependent: :destroy
  has_many :members, through: :cliq_memberships, source: :user
end

class User < ActiveRecord::Base
  has_one :owned_cliq, foreign_key: 'owner_id', class_name: 'Cliq', dependent: :destroy

  has_many :cliq_memberships, dependent: :destroy
  has_many :cliqs, through: :cliq_memberships
end

我的视图控制器操作:

def show
  @cliq = Cliq.find(params[:id])
  @cliq_owner = @cliq.owner
  @cliq_members = @cliq.members
  @pending_members = @cliq.pending_members
  @cliq_requests = @cliq.cliq_requests #(find a way to show all incoming requests)
  @cliq_memberships = CliqMembership.all
end

我的“实际”观点:

<div>
  <% @cliq.members.each do |member| %>
    <ul><%= link_to member.username, user_path(member) %></ul>
  <% end %>
  <% @cliq.cliq_memberships.each do |cliq_membership| %>
    (<%= link_to "Delete Member", cliq_membership, :method => :delete %>)
  <% end %>
</div>

日志:

Cliq Load (0.0ms)  SELECT  `cliqs`.* FROM `cliqs` LIMIT 1
CliqMembership Load (0.5ms)  SELECT  `cliq_memberships`.* FROM `cliq_memberships` WHERE `cliq_memberships`.`cliq_id` = 4 AND `cliq_memberships`.`id` = 9 LIMIT 1
Completed 404 Not Found in 18ms (ActiveRecord: 0.5ms)

ActiveRecord::RecordNotFound (Couldn't find CliqMembership with 'id'=9 [WHERE `cliq_memberships`.`cliq_id` = ?]):
app/controllers/cliq_memberships_controller.rb:44:in `destroy'

2 个答案:

答案 0 :(得分:0)

尝试将has_many :cliq_memberships, dependent: :destroy更改为has_many :cliq_memberships, dependent: :destroy, foreign_key: 'member_id'

答案 1 :(得分:0)

我通过检查我的请求代码(也是一个has_many:通过关联并具有类似的操作)来解决它。不知道为什么我花了这么长时间来解决它。

我将方法改为:

let sliceArray = Array(slice) // [4, 5, 6, 7]
sliceArray.startIndex // 0
相关问题