使用devise删除与已停用用户相关的所有帖子

时间:2016-02-15 16:06:05

标签: ruby-on-rails devise

如何删除与已停用用户相关的所有帖子?我目前正在使用此代码:

<% @questions.each do |question| %>
<div class="pad">
    <div class="forum-question">
        <p><%= link_to question.title, question %>
        <br/><span class="pull-right"><%= time_ago_in_words(question.created_at) %> ago, by
         <%= question.user.username %>
<% end %>

但问题是,如果用户决定取消他的帐户,循环将失败并导致未定义的错误,因为我显示用户的用户名。为了避免在开发应用程序时获取它,我改为:

    <% @questions.each do |question| %>
    <div class="pad">
        <div class="forum-question">
            <p><%= link_to question.title, question %>
            <br/><span class="pull-right"><%= time_ago_in_words(question.created_at) %> ago, by
             <% if @user.blank? %>
                deleted user
             <% else %>
             <%= question.user.username %>
             <% end %></span></p>
        </div>
    </div>
    <% end %>

有没有办法编写if语句,当他们按下“取消我的帐户”按钮时删除所有用户的帖子?

2 个答案:

答案 0 :(得分:0)

你可以做以下方法,请创建路线。如果需要,将方法名称替换为必要的更改, current_user.id 只能在具有Devise gem或使用当前用户的id替换时使用。我假设您有一个用户有很多帖子关联,如果有,

在视图文件中,

<%= link_to "Delete my account", delete_posts_path(current_user.id) %>

在控制器中,

 def delete_posts
      user_id = params[:id]
      user = User.find_by_id(user_id)
      user.posts.destroy_all
      redirect_to root_path
    end

在路线中,

get 'delete_posts', to: 'controller_name#delete_posts'

在上述路线中插入您的控制器名称。

答案 1 :(得分:0)

听起来您希望用户与他们发布的问题之间的关联有dependent: :destroy选项。我假设它是这样的:

class User
  has_many :questions

如果您查看various options for dependent on a has_many,可以将其设置为:

has_many :questions, dependent: :destroy

其中,来自文档:

  

控制关联对象在其所有者被销毁时会发生什么:

     

:destroy导致所有相关对象也被销毁

这意味着当您的用户实例被销毁时,问题也将被销毁。

您是否确实要删除已取消其帐户的用户的所有问题是另一回事。如果它们有用,那么删除它们将是一种耻辱,但这完全是一个不同的问题。