Ruby on rails RubyonRails:在一个动作中同时呈现json和布局
我有一个动作看起来像这样Ruby on rails RubyonRails:在一个动作中同时呈现json和布局,ruby-on-rails,ruby,json,Ruby On Rails,Ruby,Json,我有一个动作看起来像这样 def asset_map_fullscreen @config_items = @config_item.ci_relationships.find(:all, include: [:secondary, :relationship]) @config_items_associated = @config_item.reverse_ci_relationships.find(:all, include: [:primary, :relation
def asset_map_fullscreen
@config_items = @config_item.ci_relationships.find(:all, include: [:secondary, :relationship])
@config_items_associated = @config_item.reverse_ci_relationships.find(:all, include: [:primary, :relationship])
@next_level = process_relationship
render :json => @next_level :layout=>false
end
我的目的是返回一个json数据,并希望执行:layout=>false
。有没有一种方法可以通过一次行动来实现这一点
当我单独给出render:json=>@next_level
时,它只是在我的页面中呈现json数据,其他什么都没有
我还有一个asset\u map\u fullscreen.html.erb
文件。我想在发送json响应的同时呈现这个文件(我需要json数据来执行一些操作)
还是简单
render json: @next_level
希望这对你有用
还是简单
render json: @next_level
如果您只需要呈现json,那么希望这样做对您有用
render :json => @next_level
如果你想呈现一些html文件,可以这样做
render partial: 'asset_map_fullscreen'
你想把两者都渲染出来。这是不可能的。可能的解决办法是
render partial: 'asset_map_fullscreen', data: @next_level
有了它,您可以部分访问变量。你应该部分地做必要的计算
还有一种可能性,您可以使用操作名创建js文件,并在该文件中执行检查。关于这一点,请看@7urkm3n答案
最后一个解决方案是将它们保存在部分的某个隐藏字段中,然后用javascript从html中提取出来 如果您只需要呈现json,那么可以这样做
render :json => @next_level
如果你想呈现一些html文件,可以这样做
render partial: 'asset_map_fullscreen'
你想把两者都渲染出来。这是不可能的。可能的解决办法是
render partial: 'asset_map_fullscreen', data: @next_level
有了它,您可以部分访问变量。你应该部分地做必要的计算
还有一种可能性,您可以使用操作名创建js文件,并在该文件中执行检查。关于这一点,请看@7urkm3n答案
最后一个解决方案是将它们保存在部分的某个隐藏字段中,然后用javascript从html中提取出来 渲染中缺少逗号。大多数情况下,如果呈现JSON,则不需要
布局
,最好只使用HTML
已更新
当像这样调用时,您得到的是对象,您只需稍后将其附加到您想要的页面中
JS文件:
创建asset\u map\u fullscreen.js.erb
文件,在页面中添加此文件
console.log('yeah worked to test only');
console.log(<%= j render @next_level %>);
现在,您需要将remote:true
添加到您的按钮或表单中,无论是什么
如果您发布它,我可以帮助您。您在渲染中缺少逗号。大多数情况下,如果呈现JSON,则不需要
布局
,最好只使用HTML
已更新
当像这样调用时,您得到的是对象,您只需稍后将其附加到您想要的页面中
JS文件:
创建asset\u map\u fullscreen.js.erb
文件,在页面中添加此文件
console.log('yeah worked to test only');
console.log(<%= j render @next_level %>);
现在,您需要将remote:true
添加到您的按钮或表单中,无论是什么
如果你发布它,我可以帮你。简单:
render:json=>@next\u-level
works简单:render:json=>@next\u-level
works不确定我是否理解正确,但如果你想呈现资产映射全屏.html.erb
模板,但也需要该页面中的json(出于某些原因,比如操纵数据或其他原因)您可以只呈现模板并将json作为实例变量传递给视图文件:
def asset_map_fullscreen
@config_items = @config_item.ci_relationships.find(:all, include: [:secondary, :relationship])
@config_items_associated = @config_item.reverse_ci_relationships.find(:all, include: [:primary, :relationship])
@next_level = process_relationship
@next_level_json = process_relationship.to_json
render :asset_map_fullscreen
end
然后在查看代码中,您可以引用@next\u level\u json
,这样您就可以将@next\u level
作为常规对象。但不确定处理关系
来自何处(控制器上的方法?)
请务必理解,您只能返回到浏览器中一种类型的
内容类型
,可以是json、html、xml、二进制等,但每次只能返回一种内容。如果您需要显示html页面并将其呈现给浏览器,然后传递json,则只需将模板呈现为html(如上所述)并将json数据保存在实例变量中以在视图中使用。您不能在同一个响应中返回html和json(如在xhr/ajax请求中)。不确定我是否理解正确,但如果要呈现资产映射\u fullscreen.html.erb
模板,但也需要该页面中的json(出于某些原因,比如操纵数据或其他原因)您可以只呈现模板并将json作为实例变量传递给视图文件:
def asset_map_fullscreen
@config_items = @config_item.ci_relationships.find(:all, include: [:secondary, :relationship])
@config_items_associated = @config_item.reverse_ci_relationships.find(:all, include: [:primary, :relationship])
@next_level = process_relationship
@next_level_json = process_relationship.to_json
render :asset_map_fullscreen
end
然后在查看代码中,您可以引用@next\u level\u json
,这样您就可以将@next\u level
作为常规对象。但不确定处理关系
来自何处(控制器上的方法?)
请务必理解,您只能返回到浏览器中一种类型的内容类型
,可以是json、html、xml、二进制等,但每次只能返回一种内容。如果您需要显示html页面并将其呈现给浏览器,然后传递json,则只需将模板呈现为html(如上所述)并将json数据保存在实例变量中,以便在视图中使用。您不能在同一个响应中返回html和json(就像在xhr/ajax请求中一样)
我想在发送json响应的同时呈现这个文件(我需要json数据来执行一些操作)
TL;DR:由于http协议规范,这是不可能的。一个人应该执行两个单独的请求
完成任务的最简单方法是呈现html
(通过erb
或其他方式),然后从呈现的页面使用javascript/AJAX调用另一个控制器操作(例如,asset\u map\u fullscreen\u json
)(同时仍然分离主请求和后续AJAX调用):
我想在发送json响应的同时呈现这个文件(我需要json数据来执行一些操作)
TL;DR:由于http协议规范,这是不可能的。一个人应该执行两个单独的请求