msc*_*ven 5 active-model-serializers ruby-on-rails-4
我正在创建一个新闻源并使用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
Run Code Online (Sandbox Code Playgroud)
串行器/ post_serializer.rb:
def event_html
ApplicationController.new.render_to_string(:partial => 'events/event', :locals => { :event => object.event }) if object.event
end
Run Code Online (Sandbox Code Playgroud)
不幸的是,我的视图有一些使用帮助器和请求对象(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>
Run Code Online (Sandbox Code Playgroud)
undefined method `host' for nil:NilClass
有什么好办法可以解决这个问题吗?
发生这种情况是因为您的控制器缺少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
Run Code Online (Sandbox Code Playgroud)
但是,对于您的情况,我会将现有控制器作为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
Run Code Online (Sandbox Code Playgroud)
序列化器/post_serializer.rb:
def event_html
context.render_to_string(:partial => 'events/event', :locals => { :event => object.event }) if object.event
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
900 次 |
| 最近记录: |