`

在一个controller中render另外一个controller中view的时候出现问题

    博客分类:
  • RoR
阅读更多
我想在posts这个controller中的show.rhtml中render另一个controller comments中new.rhtml,以达到在一个post下显示快速回复的功能,代码如下:
PostController
  1. def  show   
  2.    @post  = Post.find(params[ :id ])   
  3.    @comment_pages , @comments  = find_comments_by_post_id( @post .id)  #需要准备好render的另外一个view所需要的数据   
  4. end   

在/posts/show.rhtml中调用了两次render,分别用来显示一个post对应的评论列表以及一个快速回复form:

/post/show.rhtml
  1. <%  for  column  in  Post.content_columns %>   
  2. <p>   
  3.   <b><%= column.human_name %>:</b> <%=h  @post .send(column.name) %>   
  4. </p>   
  5. <%  end  %>   
  6. <p>   
  7.   <%= link_to 'Edit',  :action  => 'edit',  :id  =>  @post  %>   
  8.   <%= link_to 'Back',  :action  => 'list' %>   
  9. </p>   
  10. <DIV>   
  11.   <%= render '/comments/list' %>   
  12. </DIV>   
  13. <DIV>   
  14.   <%= render '/comments/ new ' %>   
  15. </DIV>   
  16.   

/comments/list.rhtml和/comments/new由scaffold自动生成,基本没有修改,所有需要的数据都经过instance variable传递,此处发现在render '/comments/new'的时候出现问题,scaffold自动生成经过我删除无关字段后的'/comments/new.rhtml':

ruby 代码
  1. fast comments:   
  2. <% form_tag  :action  => 'create'  do  %>   
  3.   <%= render  :partial  => 'form' %>   
  4.   <%= submit_tag  "Create"  %>   
  5. <%  end  %>   

错误的展现页面在附件中,明明应该显示/comments下的new.rhtml,但实际展现的确看起来很想/posts/下的edit。

后来观察/comments/new.rhtml,突然想到这个里面又render了_form.rhtml这个文件,问题会不会出在这个多次的render上面,经过实验,发现果然如此,将上述代码改为:

ruby 代码
  1. fast comments:   
  2. <% form_tag  :action  => 'create'  do  %>   
  3.   <%= render  :partial  => '/comments/form' %>   
  4.   <%= submit_tag  "Create"  %>   
  5. <%  end  %>   

注意在render partial的时候指定了_form的完整路径,这下终于显示正常了,没有看rails的源代码,不过通过这个问题猜想rails在render的时候,如果没有指定完整路径(从app/views/开始),会尝试render当前controller下的同名文件。为了证明,首先将/comments/new.rhtml中的render改为最初出现错误的版本,然后将posts下的_form.rhtml改名,再次调用show方法,果然报错,提示无法找到/posts/_form.rhtml文件。

错误最终解决,发现自己对rails的了解还是刚刚知道一点儿皮毛。这个小玩意儿弄完了一定要好好研究下rails的source code。

分享到:
评论

相关推荐

    Backbone.js框架中简单的View视图编写学习笔记.docx

    在本例中,`render`方法添加了一个按钮和一个无序列表到`el`内。`this.$el.append`使用jQuery选择器和方法操作DOM。 6. **事件处理函数**: `addItem`方法是事件处理器,当用户点击按钮时被调用。它增加`counter`...

    Go-Packagerenders是一个中间件为Macaron提供模板渲染

    在路由处理函数中,通过`ctx.Render`方法渲染"index.tmpl"模板,并传递一个包含"Title"键的接口映射,这个键值会被用于替换模板中的相应占位符。 renders中间件还支持多种高级特性,比如嵌套模板、部分视图、模板...

    JQuery中的MCRV框架

    在JavaScript编程中,jQuery是一个非常流行的库,它极大地简化了DOM操作、事件处理和Ajax交互。然而,对于大型应用,仅仅依赖jQuery可能不足以实现良好的代码组织和可维护性。因此,一些开发者提出了在jQuery基础上...

    什么是 MVVM 模式1

    在React-Native这样的跨平台框架中,View是Component的render函数,Component自身则包含了Controller的功能,而Model依旧独立。 ViewModel的出现使得业务逻辑与视图逻辑分离,降低了耦合度。以登录场景为例,...

    Laravel开发-render .zip

    "Laravel开发-render .zip"可能是一个包含Laravel项目源代码、相关资源和文档的压缩文件,用于帮助开发者学习或快速搭建基于Laravel的渲染系统。 在Laravel框架中,“render”通常指的是视图渲染过程,即把blade...

    render-public-portlet-5.2.6.1.zip_5 to 1

    综上所述,"render-public-portlet-5.2.6.1.zip_5 to 1" 是一个教育性的Liferay Portlet,用于演示如何在Liferay平台上进行项目开发,同时它也代表了一次从5到1的重大改进,可能包含了性能优化、功能精简或用户体验...

    Yii中render和renderPartial的区别

    在Yii框架中,页面输出渲染是一个基础且核心的操作,这一过程涉及到视图(View)和控制器(Controller)之间的交互。在这个过程中,render和renderPartial这两个方法起到了非常重要的作用,它们都是用于渲染视图的,...

    微信小程序-对微信设计指南中的Web设计和小程序基础控件库的练习

    微信小程序通过 Data 构建...&gt; 在 Rails 程序中,客户端的请求 (request) 会到达对应的 Controller 实例,然后由这个 Controller 实例中的对应的 action 来处理请求, &gt; 处理后的数据会通过 render 方法响应给客户端。

    view-controller:EncorePHP 的视图加载器和控制器

    在构建Web应用程序时,视图和控制器是两个关键的概念,它们在MVC(模型-视图-控制器)架构中起着至关重要的作用。EncorePHP是一个轻量级的PHP框架,它提供了简单而强大的工具来处理视图加载和控制器操作。让我们深入...

    浅析JavaScript MVC框架在Web开发中的应用.pdf

    JavaScript MVC框架是当前Web开发中的热门话题之一,MVC全称为Model-View-Controller,分别对应模型、视图和控制器三个部分。该框架的出现解决了传统的JavaScript开发中遇到的问题,如代码混乱、难以维护和扩展等...

    extmvc的资料

    在Ext JS中,所有的MVC程序都是从Application类的一个实例开始的,该实例包含了应用程序的全局变量,如应用名称,同时定义了所需的Models、Views和Controllers。 #### 三、Application类的实例化 在Ext JS中,每个...

    egg框架搭建后端的基本使用

    在 Controller 中,使用 `await ctx.render('render-demo', data);` 渲染 View 文件夹下的名叫 `render-demo` 的 HTML 文件,`data` 是传输过去给 HTML 页面的数据。 安装 Sequelize 插件 首先,安装 Sequelize ...

    Laravel开发-laravel-route-view-helper

    在Laravel框架中,路由(Route)和视图(View)助手是开发者日常工作中不可或缺的工具,它们极大地简化了Web应用的开发流程。本篇文章将深入探讨“Laravel开发-laravel-route-view-helper”这一主题,旨在帮助你更好...

    MVC中的视图的实现类,可直接使用

    在这个例子中,`render()` 方法接受一个模板文件名和一个数据数组。它使用 `ob_start()` 和 `ob_get_clean()` 来捕获输出缓冲区的内容,这允许我们动态生成和返回 HTML。`extract()` 函数则将数据数组中的键值对作为...

    vue面试题2.pdf

    需要注意的是,当我们启用 history 模式的时候,由于我们的项目是一个单页面应用,所以在路由跳转的时候,就会出现访问不到静态资源而出现 404 的情况,这时候就需要服务端增加一个覆盖所有情况的候选资源:如果 URL...

    Zend中自定义Smarty模版

    在**Action**控制器中自定义**Smarty**模板引擎主要涉及以下几个步骤: 1. **禁止默认渲染**:通过`$this-&gt;_helper-&gt;viewRenderer-&gt;setNoRender();`来禁用默认的视图渲染机制。 2. **加载配置文件**:使用`Zend_...

    Robocop-experience:使用JavaScript v8引擎在MVC中创建ControllerView,并在Java中创建模型

    (Robocop)在MVC中创建控制器/视图 JavaScript v8引擎和您的Java模型中的经验[框架测试经验] 在/ conf / routes中映射您的路由 # Home page GET / app.index 在javascript / coffeScript中实现您的控制器 app . ...

    SPRINGMVCDEMO

    DispatcherServlet 负责接收请求并分发给合适的处理程序,通常是一个实现了 Controller 接口的类。Controller 处理业务逻辑,与模型交互,然后将数据传递给视图进行渲染。Model 存储应用程序数据,而 View 负责展示...

    MVC下使用RDLC报表的示例

    在.NET框架中,MVC(Model-View-Controller)模式是一种流行的应用程序开发架构,用于构建可维护性和可扩展性良好的Web应用。而RDLC(Report Definition Language Client Reports)是微软提供的一种报表设计工具,...

Global site tag (gtag.js) - Google Analytics