Rails开发:如何在B的show视图中渲染A的index视图内容
方案1:直接渲染A的index模板(快速实现)
- 第一步:修改B模块控制器的
show方法,提前赋值A的index所需的实例变量,和A控制器index方法里的赋值逻辑保持一致即可,示例:
# app/controllers/b_controller.rb def show # 保留B的show方法原有逻辑 @b = B.find(params[:id]) # 新增A的index需要的变量赋值 @a_collection = A.all # 替换成你A控制器index里原本的查询逻辑 end
- 第二步:在B的show视图指定位置插入渲染代码即可:
<p>..stuff for B..</p> <%= render template: "a/index" %> <p>..some more B-stuff</p>
注意模板路径里的模块名要和实际视图文件夹名一致,默认scaffold生成的是小写的a文件夹,所以写a/index。
方案2:抽离公共局部视图(更推荐,耦合度更低)
如果后续还有多处需要复用A的列表内容,建议把A的index里的核心渲染逻辑抽成局部视图,避免依赖实例变量,复用性更高:
- 第一步:新建局部视图文件
app/views/a/_collection.html.erb,把原A的index.html.erb里和@a_collection渲染相关的代码全部移到这个文件里,把代码里的@a_collection替换成局部变量a_collection。 - 第二步:修改原A的index.html.erb,渲染这个局部,传入实例变量:
<!-- 保留原A的index页面其他内容 --> <%= render "a/collection", a_collection: @a_collection %>
- 第三步:B的show方法里可以不用传实例变量,直接在渲染局部的时候传入查询结果即可,控制器和视图代码分别如下:
# B控制器的show方法无需额外赋值实例变量 def show @b = B.find(params[:id]) end
<!-- B的show视图里的渲染代码 --> <p>..stuff for B..</p> <%= render "a/collection", a_collection: A.all %> <p>..some more B-stuff</p>
注意事项
如果A的index页面有单独引入的CSS、JS或者分页逻辑,需要在B的show页面也同步引入对应资源,避免渲染异常。
内容的提问来源于stack exchange,提问作者Kryvir Myby
相关产品推荐
相关产品推荐

