【问题标题】:With Active Model Serializers, how do you render a partial?使用 Active Model Serializers,如何渲染部分?
【发布时间】:2016-07-19 21:30:01
【问题描述】:

我正在创建一个新闻源并使用 Active Model Serializers gem 设置一个 JSON 响应。我想渲染一个常规的 ERB 部分并将其作为 JSON 中的属性之一。

控制器/posts_controller.rb:

def index
  @posts = Post.all
  respond_to do |format|
    format.json { render json: @posts.to_a, each_serializer: PostSerializer }
  end
end

序列化器/post_serializer.rb:

def event_html
  ApplicationController.new.render_to_string(:partial => 'events/event', :locals => { :event => object.event }) if object.event
end

不幸的是,我的视图中有一些使用帮助程序和请求对象(url)的代码,当我尝试执行此操作时出现错误。

事件/_event.html.erb:

<div class="event">
  <h4 class="title"><%= link_to event.name, event %></h4>
  <div class="date"><%= date_range event.start_at, event.end_at %></div>
  <div class="description"><%= event.description.html_safe %></div>
</div>

undefined method `host' for nil:NilClass

有解决这个问题的好方法的想法吗?

【问题讨论】:

  • 你能分享完整的错误堆栈跟踪吗?

标签: ruby-on-rails-4 active-model-serializers


【解决方案1】:

这是因为您的控制器缺少 response 属性。

您可以对控制器的请求设置如下:

def event_html
  ApplicationController.new.tap {|c|  
    c.request = ActionController::TestRequest.new(host: "localhost")
  }.render_to_string(:partial => 'events/event', :locals => { :event => object.event }) if object.event
 end

但是,对于您的情况,我会将现有控制器作为 context 传递给序列化程序

控制器/posts_controller.rb:

def index
  @posts = Post.all
  respond_to do |format|
    format.json { render json: @posts.to_a, each_serializer: PostSerializer, context: self }
  end
end
# ... or ...
def default_serializer_options
  {
    context: self
  }
end

序列化器/post_serializer.rb:

def event_html
  context.render_to_string(:partial => 'events/event', :locals => { :event => object.event }) if object.event
end

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 2017-05-19
    • 2016-06-08
    • 1970-01-01
    • 2017-01-05
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多