活动模型序列化器:nil:NilClass 的未定义方法“url_for”

2024-01-09

我在用着active_model_serializersgem 在我的应用程序中发送高级 json 响应。它实际上工作正常,但由于我安装了该 gem,使用几分钟后,应用程序崩溃,显示上面的错误。

不确定我的代码是否与之相关,但不知何故,我也需要发回一些部分代码。由于宝石似乎不支持它,我做了一个解决办法:

class AppSerializer < ActiveModel::Serializer

  def render_partial_to_json(options = {})
    partial = options[:partial] || nil
    locals  = options[:locals] || nil

    context = Rails.configuration.paths['app/views']
    view    = ActionView::Base.new(context)

    view.class.class_eval do
      include Rails.application.routes.url_helpers
      include ApplicationHelper
    end

    view.render(
      partial: partial,
      locals: locals
    )
  end
end

然后,在我的序列化器中,我可以执行以下操作:

class ActivitySerializer < AppSerializer

  attributes :id, :kind, :data, :created_at, :html

  has_many :comments
  has_one :user

  def id
    ScatterSwap.hash(object.id)
  end

  def html
    render_partial_to_json(
      partial: 'activities/post',
      locals: { activity: object }
    )
  end
end

这段代码工作正常,我得到了我的部分作为 JSON 属性。 奇怪的是,错误逐渐出现在任何页面上。删除它的唯一方法是重新启动服务器。但同样,使用几分钟后,问题又回来了。

这是日志的一部分:

Completed 500 Internal Server Error in 65ms

NoMethodError - undefined method `url_for' for nil:NilClass:
actionpack (4.0.3) lib/action_dispatch/routing/url_for.rb:155:in `url_for'
actionpack (4.0.3) lib/action_view/routing_url_for.rb:83:in `url_for'
turbolinks (2.2.1) lib/turbolinks/xhr_url_for.rb:12:in `url_for_with_xhr_referer'
actionpack (4.0.3) lib/action_dispatch/routing/route_set.rb:234:in `call'
actionpack (4.0.3) lib/action_dispatch/routing/route_set.rb:178:in `call'
actionpack (4.0.3) lib/action_dispatch/routing/route_set.rb:274:in `block (2 levels) in define_url_helper'
app/views/activities/_post.html.haml:2:in `_app_views_activities__post_html_haml__1000109198282705156_2214339020'
actionpack (4.0.3) lib/action_view/template.rb:143:in `block in render'
activesupport (4.0.3) lib/active_support/notifications.rb:161:in `instrument'
actionpack (4.0.3) lib/action_view/template.rb:141:in `render'
actionpack (4.0.3) lib/action_view/renderer/partial_renderer.rb:306:in `render_partial'
actionpack (4.0.3) lib/action_view/renderer/partial_renderer.rb:279:in `block in render'
actionpack (4.0.3) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument'
activesupport (4.0.3) lib/active_support/notifications.rb:159:in `block in instrument'
activesupport (4.0.3) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.0.3) lib/active_support/notifications.rb:159:in `instrument'
actionpack (4.0.3) lib/action_view/renderer/abstract_renderer.rb:38:in `instrument'
actionpack (4.0.3) lib/action_view/renderer/partial_renderer.rb:278:in `render'
actionpack (4.0.3) lib/action_view/renderer/renderer.rb:47:in `render_partial'
actionpack (4.0.3) lib/action_view/helpers/rendering_helper.rb:27:in `render'
haml (4.1.0.beta.1) lib/haml/helpers/action_view_mods.rb:10:in `block in render_with_haml'
haml (4.1.0.beta.1) lib/haml/helpers.rb:89:in `non_haml'

你们中有人已经面临过类似的事情吗?

EDIT :
根据要求,这是我的观点的代码:

%article#comment-id-1.comment-item.m-t


= link_to profile_url(activity.user), class: "pull-left thumb-sm avatar" do
  = display_picture_for activity.user, resizing_by: "36x36"
  %span.arrow.left
  %section.comment-body.panel.panel-default
    %header.panel-heading.bg-white
      = link_to profile_url(activity.user) do
        = activity.user.fullname
      %span.text-muted.m-l-sm.pull-right
        %i.fa.fa-clock-o
        = time_ago_in_words activity.created_at
    .panel-body
      %div
        = activity.data[:message]
      .comment-action.m-t-sm
        %a.btn.btn-default.btn-xs.active{"data-toggle" => "class", href: "#"}
          %i.fa.fa-star-o.text-muted.text
          %i.fa.fa-star.text-danger.text-active
          Like
        %a.btn.btn-default.btn-xs{href: "#comment-form"}
          %i.fa.fa-mail-reply.text-muted
          Reply

EDIT 2 :

经过更多挖掘后,我发现这段代码:

class AppSerializer < ActiveModel::Serializer

  def render_partial_to_json(options = {})
    partial = options[:partial] || nil
    locals  = options[:locals] || nil

    context = Rails.configuration.paths['app/views']
    view    = ActionView::Base.new(context)

    view.class.class_eval do
      include Rails.application.routes.url_helpers
      include ApplicationHelper
    end

    view.render(
      partial: partial,
      locals: locals
    )
  end
end

当调用覆盖Rails助手并加载库时,这会导致整个系统无法工作。然而,我该如何解决它呢?


好吧,我终于找到了解决办法。问题确实出在我身上edit 2上面帖子里的点。

要修复它,因为我已经在使用rails_config gem (https://github.com/railsjedi/rails_config https://github.com/railsjedi/rails_config)在我的应用程序中,我使用它是为了能够直接从序列化器渲染我的部分内容,而不会破坏 Rails 神奇的自动加载。

首先,我将上下文设置为配置(设置):

# application_controller
class ApplicationController < ActionController::Base
  before_filter :set_context_for_serializer

  def set_context_for_serializer
    Settings.context = self
  end
end

然后,在我的序列化器中,我需要做的就是:

class ApplicationSerializer < ActiveModel::Serializer
  def render_partial_to_json(options = {})
    partial = options[:partial] || nil
    locals  = options[:locals] || nil

    Settings.context.render_to_string(
      partial: partial,
      layout: false,
      formats: :html,
      locals: locals
    )
  end
end

class ActivitySerializer < ApplicationSerializer
  attributes :id, :kind, :data, :created_at, :html

  def html
    render_partial_to_json(
      partial: 'activities/post',
      locals: { activity: object }
    )
  end
end

就是这样,现在它可以完美运行了。如果你们有其他方法(更像Rails)来做到这一点,我会很想知道。

Thanks

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

活动模型序列化器:nil:NilClass 的未定义方法“url_for” 的相关文章

  • 基于数据库的动态Rails路由

    我正在使用 Rails 2 3 构建一个包含各种模块 博客 日历等 的 CMS 每个模块都由不同的控制器处理 并且工作得很好 我遇到的唯一问题是根 URL 根据用户选择的配置 此默认 URL 应显示不同的模块 即不同的控制器 但我必须确定正
  • 如何在 Rails 应用程序中删除 URL 的尾部斜杠? (在 SEO 视图中)

    为了避免内容重复 我希望避免通过多个 URL 带或不带尾部斜杠 访问我的网站页面 目前 URL catalog product 1 and catalog product 1 导致同一页面 我的目标是将第二个 URL 重定向到第一个 当然是
  • 使用 Active Record 信誉系统 gem,当我按投票排序时不会发生排序

    遵循 RailsCast 的信誉系统 gem 我将以下代码添加到我的 microposts controller 中 def index microposts Micropost paginate page params page find
  • 使用 FactoryGirl 测试简单的 STI

    我有一个类 它是其他一些专门处理该行为的类的基础 class Task lt ActiveRecord Base attr accessible type name command validates presence of type na
  • 活动管理:同一列中的多个操作,类似于查看、编辑、删除

    我正在使用 active admin gem 为我的 ruby on Rails 应用程序提供一个管理控制台 我遇到一个问题 我想对索引页面上的每个项目进行多个自定义操作 就像查看 编辑 删除一样 但是 当添加自定义操作时 仅显示最后一个而
  • Rails 销毁除最新的 n 条记录之外的所有记录

    如何使用 Rails 的 ActiveRecord 销毁除最新的 n 条记录之外的所有记录 我可以使用 order 和 limit 获取最新的 n 条记录 但如何销毁逆函数 这些方法中的任何一个都可以做到这一点 Fetch your lat
  • docker环境下日志不保存到文件

    在我的生产环境中production rb 我已配置我的日志将保存到文件中 config logger Logger new log production log 当我在本地运行时 使用命令行启动服务器rails s e productio
  • 用于输入地址的自动完成文本框是个好主意吗?

    通过传统形式输入我的地址让我发疯 为什么我必须输入我的城市 州 and邮政编码何时可以从我的邮政编码推断出我的城市和州 从下拉列表中选择您的状态是一件很痛苦的事情 通常您无法使用 Tab 键进入它 您必须使用鼠标等 替代文本 http im
  • 如何将 current_user 传递给 Sidekiq 的 Worker

    我正在努力通过current user or User find 1 到工作模块 但在 sidekiq 的仪表板中出现错误 localhost 3000 sidekiq retries NoMethodError 未定义方法 支持 字符串
  • 前面的冒号:YAML 语法

    我目前在项目中使用 Sidekiq 并且有以下 YAML 配置文件 concurrency 5 pidfile tmp pids sidekiq pid logfile log sidekiq log staging concurrency
  • Rspec:测试救援

    尝试测试我的函数是否能够正确地从异常中解救 更改参数 文件名 然后重试一次 我可以让函数接收第一次尝试 但无法让它接收第二次尝试 控制器 begin video get video video id rescue matches video
  • Rails 3.1 引擎迁移不起作用

    我正在创建一个带有迁移的 Rails 3 1 引擎 rake db migration 在该引擎和主机应用程序内运行良好 但我需要将此引擎包含到另一个 Rails 引擎中 第二个引擎包含用于测试的虚拟应用程序 我将这一行添加到该虚拟应用程序
  • 使用 Rails 4(和 Hstore)在 PostgreSQL 中存储嵌套哈希

    我有一个 Rails 应用程序 它聚合了来自 Google API 的大量数据 我当前将 JSON 响应存储在 MongoDB 中 因此我的 Rails 应用程序同时具有 pg 和 mongo 然而 今天 我遇到了 PostgreSQL H
  • Ruby on Rails 基本概念总结

    作为 Rails 的新手 我很难找到提供 Ruby on Rails 概要的网站或参考资料 我对 MVC ActiveRecord 以及诸如此类的东西有基本的了解 但我很难理解其中的一些关系和基础知识 例如 我需要注意哪些命名约定 控制器操
  • 您在哪里存储 Rails 应用程序的版本号?

    我们用精彩的语义版本控制 http semver org 版本化 Rails 应用程序时的范例 我的一个问题是最好将这个号码存储在哪里 我见过它存储在 lib environment rb etc 只是想知道人们对最佳实践的看法是什么 我的
  • Grails(现在)值得吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我知道这是一个复制 https stackoverflow com questions 397228 is grails worth it然而
  • 无法在 Windows 7 上安装 Rmagick 和 Imagemagick

    当我跑步时gem install rmagick 2 13 1 gem从 rmagick 2 13 1 gem 所在的目录中 我收到一个错误 指出它无法构建 gem 本机扩展 下面显示 c Ruby192 bin ruby exe extc
  • rvm + Rails3 + gmaps4rails -acts_as_gmappable

    我是一个红宝石导轨之类的菜鸟 抱歉 如果我的问题很愚蠢 我设置了一个运行 ruby 1 8 7 p334 的 rvm 作为用户 环境 我已经为我的 应用程序 创建了一个 gemset 现在我想在页面上显示地址的地图 我四处寻找 发现了 gm
  • 我可以在同一台 Apache 服务器上运行 Python Django 和 Ruby 吗?

    我正在使用 ModWSGI 在 Apache2 上运行 Python Django 并且我想在同一台服务器上运行 Ruby on Rails 可以这样做吗 我读到 Passenger for Ruby on Rails 也可以支持 Djan
  • Rails 4 - 如何在活动记录查询中为includes()和joins()指定别名

    我如何给出别名 例如includes 给出如下 用户 活动记录模型 Student 活动记录模型 继承自User STI Teacher 活动记录模型 继承自User STI 项目 活动记录模型 这里有一些例子 第一个案例 更多性传播感染协

随机推荐

  • 我们应该为带有选择下拉菜单的弹出窗口编写单独的页面对象吗?

    我是使用 selenium 和 java 的页面对象模型自动化的新手 我正在使用页面对象模型 并将每个页面作为单个类 并将该页面中的操作作为方法 我们是否应该为提交表单时出现的简单弹出窗口编写单独的页面对象 此弹出窗口用于选择服务类型 接下
  • 计算文件复制/移动的估计时间?

    受此启发卡通漫画 http xkcd com 612 我想知道向用户提供文件复制 移动估计的最佳机制是什么 xkcd 上的 alt 标签如下 他们可能会说 连接可能已丢失 但更有趣的是进行天真的时间平均 让您希望等待 1 163 小时左右
  • 有没有办法阻止 SQL Server 在 CREATE / ALTER 期间验证存储过程中的 SQL

    我们系统的一方面要求我们的 SQL Server 实例通过链接服务器连接与 MySQL 服务器通信 MSSQL gt LinkedServer MSDASQL ODBC 提供程序 gt MySQL ODBC 连接器 gt MySQL DB
  • 在 C# 中使用图像和位图?

    我正在开发一个项目 其中包括由管理面板管理的图片库 我想在管理面板中向管理员显示缩略图 该面板处于活动状态并将显示给最终用户 好的 我将图像存储到数据库中的两个参数 ImageData byte ImageMimeType 所以我想在第一次
  • 使用远程主机作为工作目录,git扩展

    由于许可限制 在特定域 特定路径 允许特定 IP 等 我们的项目必须托管在服务器上并在那里进行测试 而不是克隆存储库并在本地进行开发和测试 因此 我们无法设置本地测试环境 我们必须使用中央存储库并将其用作一种 远程工作目录 开发团队希望使用
  • 适用于 iOS 设备的 vCard 格式是否正确?

    在 iOS 5 及更高版本中 Apple 引入了ABPersonCreatePeopleInSourceWithVCardRepresentation方法 这对于将 vCard 提供给地址簿并获取所创建人员的 ABRecordRefs 非常
  • 防止编译在 OS X 上生成 dSYM(使用 make)

    我有一个 C 项目 开源 默认情况下不需要删除调试符号 有很多测试可执行文件 在 OS X 上生成了很多 dSYM 文件 我尝试过 g3 作为 g 标志 但无济于事 有想法吗 谢谢 胡安 如果您使用 g 标志进行编译 请将其删除
  • cmake/ctest:是否可以使用构建目标的创建作为测试?

    我有一个程序 它读取文件格式的描述 好奇的 ISO 10303 11 并从中生成 c 生成的代码被编译到库中 并且该库与各种可执行文件链接以读取 写入该文件格式 我已设置 CMake 来构建生成器程序并为配置时指定的任何文件格式生成库 现在
  • .NET Web API:如果实例为 null,类级别验证属性会导致 Web API 抛出 ArgumentNullException

    例如 我有一个 DTO 类 如下所示 public class ExampleDto DataMember Name Date IsRequired true Order 1 Required public DateTime Date ge
  • 使用 jquery 中的 click() 事件从表单更新 Highchart

    我有一个图表 每当提交同一页面上的表单时我都想更新该图表 这var chart new Highcharts Chart options 表达式本身可以正常工作 它绘制图表 当我将它放在回调函数中时 click 事件中 当我单击相应的提交按
  • 在Linux上的C中分配可执行RAM

    我想在 Linux 上用 c 制作一个简单的即时编译器 如何分配内存 以便向其中写入原始 x86 代码并像其他函数一样执行它 请参阅 mprotect 用代码填充 n 页大小的内存区域 使用 mmap 分配 后 更改其权限以禁止写入并允许执
  • SQL Server 和 C# 的输出不同

    我相信我的编码有问题 我猜它不是按日期过滤 请帮忙 SQL代码 SELECT CONVERT char 80 i InvDate 3 AS InvDate i InvoiceNo i EmployerCode i TaxAmount i S
  • 如何使用 Python 测试 Selenium 中的警报/弹出窗口

    我被自动化困住了 当我输入错误的用户名和密码时 它会弹出 无法登录 尝试不同的用户名 def test logonWrongUserName self self setUpClass Initialize the driver self s
  • 如何在 git 中自动生成版本字符串[重复]

    这个问题在这里已经有答案了 可能的重复 为 Git 存储库启用 ident 字符串 https stackoverflow com questions 1792838 enable ident string for git repos 在我
  • UIRefreshControl在UITableView iOS6的底部?

    是否可以添加UIRefreshControl在底部UITableView 我会用它来加载更多数据 请问 有什么建议吗 我相信这个问题不会有任何简单的解决方案 也许有人可以编写一个单独的库来实现此行为 而且一旦您在表视图中缓存数据 它会导致更
  • 设置对象 nil 与release+realloc

    这不是垃圾收集环境 我有一个类实例变量 在运行时的某个时刻 我需要使用与最初构造时不同的数据集重新初始化 假设地说 如果我有一个NSMutableArray or an NSMutableDictionary 做这样的事情会更有效率吗 my
  • 在 MVC 应用程序中使用 ELMAH 调试/跟踪消息

    我们如何在 MVC 应用程序中使用 ELMAH 添加调试 跟踪消息 ELMAH 通常用于报告异常 而不是作为一般的调试 跟踪日志 对于调试 跟踪日志记录 我建议结合使用log4net https stackoverflow com ques
  • 在 Redhat 5 上运行 JavaFX 应用程序

    From my 上一个问题 https stackoverflow com questions 24420651 javafx helloworld jar cannot be ran on different platform 我知道Re
  • Azure 服务总线空闲时自动删除

    我试图找出设置 AutoDeleteOnIdle 时的正确行为 我有一个名为 MyGameMessages 的主题 不透露游戏名称 因为它可能被视为广告 我所做的是在服务器场中的每个节点上创建一个订阅 var manager GetName
  • 活动模型序列化器:nil:NilClass 的未定义方法“url_for”

    我在用着active model serializersgem 在我的应用程序中发送高级 json 响应 它实际上工作正常 但由于我安装了该 gem 使用几分钟后 应用程序崩溃 显示上面的错误 不确定我的代码是否与之相关 但不知何故 我也需