【问题标题】:How to destroy a has_many :through association by selected user如何销毁has_many:通过选定用户的关联
【发布时间】:2016-04-05 22:50:11
【问题描述】:

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

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

附:我不想为此使用授权系统。只需在控制器中完成就应该足够简单。我只需要能够删除任何组成员。 Groups = Cliqs。我没有将成员资格设置为组的嵌套资源。

错误:找不到 'id'=2 的 CliqMembership [WHERE cliq_memberships.user_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'

【问题讨论】:

  • 当它失败时,是否有错误记录在任何地方?消息是什么?如果不确定,请尝试将destroy 更改为destroy!
  • 我将更新问题以包含错误消息。
  • 谢谢,您是否还可以从您的 log/development.log 文件中添加包含 DELETE 请求的位。
  • 我为请求添加了日志文件。我还编辑了我的问题,以反映我所做的似乎部分有效的更改。它只允许我删除第一个创建的 Cliq(因为 find_by 方法的工作方式),但不允许我删除“选定的”Cliq 的成员关联。我试过 find_by_id 和 find_by(id: params[:cliq_id]),但无济于事。我该如何解决这个问题?
  • 刚刚解决了。检查答案。

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


【解决方案1】:

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

【讨论】:

  • 我现在不在电脑前,但我会试试看。我需要指定 class_name 或 :source 吗?
  • 你必须检查你的模式表。我怀疑在您的 cliq_memberships 表中,您使用的外国 id 是 member_id 而不是 user_id,这就是您收到错误消息的原因
【解决方案2】:

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

我将方法更改为:

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

    @cliq_membership.destroy
       flash[:notice] = "You left the Cliq."
    redirect_to cliqs_path
end

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2017-11-05
    • 1970-01-01
    • 2016-12-09
    • 2019-09-23
    • 1970-01-01
    相关资源
    最近更新 更多