公共活动中未定义的方法“销毁”

2023-12-12

用户可以在屏幕上发表评论,并由 PublicActivity 进行跟踪:

@comment.create_activity :create, owner: current_user, recipient: @comment.screen.user

注释取决于: :destroy 屏幕型号。

但是,当我删除屏幕时,虽然评论被删除,但该评论的 PublicActivity 记录仍然存在。

这是我的Screens Controller:

  def destroy
    @activity = PublicActivity::Activity.find_by_trackable_id(params[:id])
    @activity.destroy #<-- Heres the Problem
    @screen.destroy
    respond_to do |format|
      format.html { redirect_to root_path }
      format.json { head :no_content }
    end
  end

但删除屏幕后,我得到undefined methoddestroy' for nil:NilClass`。

我在 Railscast 上读到:

这是由于在对象创建后调用了create_activity方法 被摧毁了。

根据 gem 维护者的说法,你只需假设记录即可 会被销毁,并在销毁前调用create_activity

我缺少什么?

以下信息

屏幕.rb

belongs_to :user
has_many :comments, :dependent =>  :destroy

评论.rb

belongs_to :user
belongs_to :screen

屏幕控制器.rb

  def create
    @screen = current_user.screens.build(screen_params)
    respond_to do |format|
      if @screen.save
         format.html { redirect_to @screen, notice: 'You successfully uploaded your Screenshot.' }
        format.json { render action: 'show', status: :created, location: @screen }
        current_user.add_points(2, 'Points for Uploading a Screenshot')
      else
        format.html { render action: 'new' }
        format.json { render json: @screen.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @activity = PublicActivity::Activity.find_by_trackable_id(params[:id])
    @activity.destroy
    @screen.destroy
    respond_to do |format|
      format.html { redirect_to root_path }
      format.json { head :no_content }
      current_user.substract_points(1, "Substraction for Deleting a Screenshot")
    end
  end

评论控制器.rb

  def create
    @screen = Screen.find(params[:screen_id])
    @comment = current_user.comments.build(comment_params)
    @comment.screen_id = @screen.id
    respond_to do |format|
      if @comment.save
        # Create Record for Public Activity
        @comment.create_activity :create, owner: current_user, recipient: @comment.screen.user
        format.html { redirect_to @screen, notice: 'Comment was successfully created.' }
        format.json { render action: 'show', status: :created, location: @comment }
      else
        format.html { render action: 'new' }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @comment.destroy
    respond_to do |format|
      @activity = PublicActivity::Activity.find_by_trackable_id(params[:id])
      @activity.destroy
      format.html { redirect_to :back }
      format.json { head :no_content }
    end
  end

这就是我的屏幕控制器销毁操作现在的样子:

  def destroy
    @screen = current_user.screens.find(params[:id])
    @activity = PublicActivity::Activity.find_by_trackable_id(params[:id])
    @activity.destroy
    @screen.destroy
    current_user.substract_points(1, "Substraction for Deleting a Screenshot")
    respond_to do |format|
      format.html { redirect_to root_path }
    end
  end

又出现同样的错误:

enter image description here


这尚未经过测试,但我认为您应该这样做。

首先,您可以删除对 screen_controller#destroy 中活动的引用

然后在你的 comments_controller#destroy 中

  @comment = current_user.comments.find(params[:id])
  @activity = PublicActivity::Activity.find_by(trackable_id: (params[:id]), trackable_type: controller_path.classify)
  @activity.destroy
  @comment.destroy

应该在您对阻止的响应之外

接下来在您的评论模型中您应该执行以下操作:

#comment.rb

private

before_destroy :find_and_destroy_comments

def find_and_destroy_comments
  activity = PublicActivity::Activity.find_by(trackable_id: self.id, trackable_type: self.class.name)
  if activity.present?
    activity.destroy
  end
end

调用 before_destroy 方法会覆盖在期间调用的默认 ruby​​ destroy 方法dependent: :destroy

让我知道这是否有效,但应该如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

公共活动中未定义的方法“销毁” 的相关文章

随机推荐

  • 为什么 com.typesafe.slick#slick_2.11;2.0.2: not find 出现 UNRESOLVED DEPENDENCIES 错误?

    我正在尝试从类型安全激活器运行 hello slick 示例 当我输入 run 时 我在 sbt 中创建一个项目 它给出了以下错误 warn warn UNRESOLVED DEPENDENCIES warn warn com typesa
  • 循环遍历文件以计算字段数

    我有一个 bash 脚本来从 txt 文件添加用户 这真的很简单 name firstname uid gid 空格分隔值 我想用 awk 检查每行是否包含 4 个字段 如果是我想返回1 如果不是返回0 file my file txt a
  • 谷歌地图:与用户一起顺利移动标记和地图?

    一旦用户打开该功能并直至终止它 我必须在谷歌地图中显示实时 实时用户移动位置 我已经使用下面的方法来为标记设置动画 private void animateMarker final Marker marker final LatLng to
  • ClickOnce 不遵守本地主机的安装文件夹

    我正在测试 ClickOnce 应用程序部署 我已经在我的机器上设置了一个虚拟目录 运行 IIS 我已指定http localhost SampleApplication作为 Visual Studio 的 发布 选项卡中的安装文件夹 UR
  • 在 AngularJS 中处理转换后的数据

    我有一个时间戳列表 我可以用 AngularJS 列出它们 不过我想将其列为日期字符串 这些日期字符串应该是可编辑的 完成后我也希望更新相关的时间戳 我的第一个问题是 AngularJS 以不同格式 过滤器 呈现项目并仍然具有双向数据绑定的
  • VIM 浏览器插件对文件执行命令

    我正在尝试 NERDtree 它非常酷 但我想做的是在所选文件上执行特殊命令或脚本 例如 我想突出显示树中的一个图像文件 按某个键并在原始文件中插入适当的 XHTML 标签 我有一个小脚本来进行格式化 我只需要在文件上运行它 或者在选择模块
  • Qt 事件和信号/槽

    在Qt世界中 事件和信号 槽有什么区别 一个会取代另一个吗 事件是信号 槽的抽象吗 在 Qt 中 信号和事件都是观察者模式 它们用于不同的情况 因为它们有不同的优点和缺点 首先 让我们准确定义 Qt 事件 的含义 Qt 类中的虚函数 如果您
  • Flutter FormatException:意外的字符(在字符 1 处)

    在 flutter 中 我使用一个 php 文件 该文件从数据库查询返回 json 响应 但是当我尝试解码 json 时 我收到此错误 E flutter 8294 ERROR flutter lib ui ui dart state cc
  • Jquery选择图像

    首先 我是 Jquery 的新手 我有这样的图像 我想要的是 当用户单击图像时 它会使图像带有边框 用户可以选择多个图像 选择时所有内容都必须带有边框 单击按钮后 我将获得图像 ID tr img src urlofimage tr gt
  • 比较两个文件在 python 中报告的差异

    我有 2 个名为 hosts 的文件 位于不同的目录中 我想使用 python 比较它们 看看它们是否相同 如果它们不相同 我想在屏幕上打印差异 到目前为止我已经尝试过这个 hosts0 open dst1 hosts r hosts1 o
  • Mapbox - 来自 GeoJson 属性的自定义标记图标

    我正在从一组 GeoJson 对象渲染标记 我想使用自定义图标作为标记 但无法确定正确的语法 下面是我用来渲染 geojson 的部分代码 asGeoJson gt type Feature properties title get lis
  • 快速通过segue传递数组

    我已经努力几天了 从我的数组中传递一个数组SecondViewController to my FirstViewController使用斯威夫特 从我的研究中我发现segue with prepareForSegue将是一个可行的选择 但
  • EXCEL VBA:如何使用 isString 或 isNumeric 验证值?

    下面是我的代码 Dim m As String n As Long n InputBox Enter sales amount If n lt 500 Or n gt 5000 Then ActiveCell Value n ActiveC
  • 操作列表内的数据框

    这可能是一个简单的问题 但我一直找不到答案 我想删除列表内数据帧的一列 x1 lt rnorm 100 0 1 x2 lt rnorm 100 0 1 x3 lt rnorm 100 0 1 x4 lt rnorm 100 0 1 df1
  • 使用 JavaScript/jQuery 捕获输入框内容的所有更改

    我有一个带有输入框的页面 以及一个处理该输入框的值并生成一段文本的函数 我希望该文本始终与输入框的内容相关 因此我使用 jQuery 附加了几个事件处理程序以捕获任何更改 input bind keyup cut paste functio
  • “Object.freeze(Object.prototype)”仅仅是用符号扩展“Object.prototype”的危险吗?

    所以 从根本上来说 这个问题不是基于意见的 我认真客观地追寻这个问题 没有feeling大多产生于主流意见 为什么扩展本机对象是一种不好的做法 这个问题是相关但未回答的问题 如果使用 Symbol 属性扩展 Object prototype
  • 如何在Android中创建目录?

    一切都在问题之中 这是我的代码 private void createDirectory File currentDirectory File f null try f new File currentDirectory getCanoni
  • 即使参数是函数调用,C 也会使用短路求值吗?

    我知道逻辑运算符会进行短路检查 也就是说 如果有这样的语句A B C 那么如果A是假的 B and C不予评价 但这也适用于以下情况 B and C是函数调用吗 例如 这段代码中的 return 语句 bool areIdentical s
  • Internet Explorer 10 及更低版本的 React、WebPack 和 Babel 会产生 SCRIPT1002:语法错误

    我已经阅读了有关类似问题的多个线程并尝试了一些建议 但没有结果 我遵循了一些相关的教程React js and 网页包3 结果 应用程序在所有浏览器上运行良好 目前 除了IE 10及以下 错误指向bundle js 一旦我使用配置Nr 1
  • 公共活动中未定义的方法“销毁”

    用户可以在屏幕上发表评论 并由 PublicActivity 进行跟踪 comment create activity create owner current user recipient comment screen user 注释取决