我有一个Ruby on Rails应用程序,它的最基本级别包括两个面板,左侧和右侧面板。我想要的是将它用作布局,并在控制器中能够像render <view_name>, <right or left panel>
那样渲染,这样,与turbolinks一起,只动态创建左侧或右侧面板。
我搜索了互联网,但没有找到像我这样的例子。我确定这是可行的但是怎么样? 编辑:它应该能够在Android的chrome中运行。 一种解决方案是在第一个请求上呈现所有视图,当我单击链接面板时,隐藏并显示,但我不认为这是好的。任何意见?
答案 0 :(得分:1)
不幸的是,这种情况不可能与turbolinks一起使用,也不能用pjax本身(有多个所谓的pjax容器)。
Turbolinks总是取代整个身体元素的内容。
Pjax总是用pjax-container
数据属性替换元素的内容。
当然有办法做到这一点。抛弃客户端javascript框架,您可以执行ajax请求并返回js
响应。
从头顶你可以看到类似这样的视图:
<强> index.html.erb 强>
<%= link_to 'Show', show_path, remote: true %>
<强>控制器强>
def show
# Do the work, fetch data from database etc.
# Keeping both formats ensures that when you hit the url directly
# the whole page gets rendered as usual (show.html.erb),
# when the request is an ajax request using the view snipper above just
# the javascript for replacing the content of a single panel is rendered (show.js.erb)
#
# Rails is smart enough so it should not be required to include the respond_to block
# in the controller, Rails automagically chooses an appropriate response format
# based on the request, you only need to have the views in place,
# but I keep it here so you get a picture.
respond_to do |format|
format.html
format.js
end
<强> show.js.erb 强>
$('.right-panel').html('<%= j render partial: "something" %>')
答案 1 :(得分:0)
经过一些研究,我得出以下结论:
除非你设定一些限制,否则我试图做的事情是不可能的。
两个面板中只有一个可以呈现存储在浏览历史记录中的“操作”。如果两个面板都呈现存储在浏览历史记录中的操作,则导航很可能无法按预期工作。
考虑到这一点,我意识到我真正需要的是在左侧面板中呈现导航感知操作,并在右侧面板中呈现其他内容(我称之为实用程序)。例如,我在这样一个面板中呈现的一件事是聊天面板。这就是facebook如何使用它的聊天。
所以基本上我可以使用标准turbolink来处理存储浏览历史记录的请求以及类似pjax的“Utils”面板。唯一的问题是Turbolinks完全呈现整个页面,即使你发送一小段html作为回应。
为了解决这个问题,我最终使用了wiselinks,这是turbolinks和pjax的完美结合。此外,与pjax不同,wiselink甚至可以处理表单。
答案 2 :(得分:0)
我不知道它是否是最佳做法,但我需要类似的东西,这就是我所做的:
我有这个布局
1st panel | 2nd panel | 3rd panel
Site Menu | Posts List | Article Show
要始终呈现帖子列表,我需要添加到我的应用程序控制器:
class ApplicationController < ActionController::Base
before_action :set_posts
def set_posts
@posts = Post.all
end
end
然后在我的布局中,这就是我所做的:
%body
#site-wrapper
#site-canvas
#reading-list
#reading-nav-block
= render 'posts/list'
#article-show
#article-nav-block
#article-content-block
= yield
#site-menu
#logo-block
.menu
基本上我将帖子#index提取到帖子#_list partial并设置变量,在所有布局中渲染post / _list。结果如下: