我在用着active_model_serializers
gem 在我的应用程序中发送高级 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助手并加载库时,这会导致整个系统无法工作。然而,我该如何解决它呢?