gpt4 book ai didi

ruby-on-rails-4 - 使用 Active Model Serializers,您如何渲染部分?

转载 作者:行者123 更新时间:2023-12-04 07:02:11 25 4
gpt4 key购买 nike

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

Controller /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

不幸的是,我的 View 有一些使用帮助程序和请求对象 (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
任何解决这个问题的好方法的想法?

最佳答案

发生这种情况是因为您的 Controller 缺少 response属性。

您可以按如下方式设置 Controller 的请求:

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

但是,对于您的情况,我会将现有 Controller 作为 context 传递。到序列化器

Controller /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

关于ruby-on-rails-4 - 使用 Active Model Serializers,您如何渲染部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22308162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com