`

在一个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。

分享到:
评论

相关推荐

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

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

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

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

    rspec_controller_testing

    render_template(:view_filename) be_success include([array, of, things]) eq() be_a(Class) be_persisted redirect_to(path or path_helper) change(Class, :count).by(num) ###设置 初始化我们的酸奶应用 $...

    Yii框架页面渲染操作实例详解

    yii的页面渲染通过在controller的action中调用$this-&gt;render($viewname...)进行,流程如下图: 在render方法中,yii会先对你的view文件进行渲染,然后如果你使用了某些layouts,则会将view渲染的输出再传入对...

    codeigniter-blade:带刀片的代码点火器

    带刀片模板的代码点火器自从与laravel一起工作了一段时间之后,我就爱上了Blade 这是在CI中使用Blade的工作副本, 只需先运行composer来安装Illuminate View软件包,然后就可以了在Controller中使用以制作新的...

    Getting Started with Unity 5 [eBook]

    Render mode 115 Creating a GUI 115 HUD 116 Creating an HUD 116 Mini-maps 120 Creating a mini-map 120 Game navigation 123 Summary 128 Chapter 7: Polishing and Optimizing the Game 129 Sight and sound ...

    epii-server:具有预设MVC模型的基于koa的服务器

    上位服务器 具有预设MVC模型的基于Koa的服务器。 @ eggjs /路由器的控制器koa-发送静态文件用于身体分析的koa.../ Render (Model) =&gt; (View) /(Response)喜欢ASP.net 不同的ActionResult做出不同的响应。 // controller

    java sring mvc 及页面提交传参

    * Simply selects the home view to render by returning its name. */ @RequestMapping(value = "/", method = RequestMethod.GET) public String home(Locale locale, Model model) { logger.info(...

    ASP.NET.MVC.5.with.Bootstrap.and.Knockout.js.1491914394

    With this practical book, you’ll learn how by combining the ASP.NET MVC server-side language, the Bootstrap front-end framework, and Knockout.js—the JavaScript implementation of the Model-View-...

    cakephp常见知识点汇总

    方法一: 在此调用/views/tasks/tasks下的hello.ctp模板 $this -&gt; viewPath = 'tasks'; $this -&gt; render('hello'); 方法二(带参): $this-&gt;redirect(array(‘controller’=&gt;’users’,’action’=&gt;’welcome’,...

    ZendFramework中文文档

    3.2.2. 高级使用:持久一个 DbTable 结果对象 3.2.3. 高级用法示例 3.3. 摘要式认证 3.3.1. 简介 3.3.2. 规范(Specifics) 3.3.3. 身份(Identity) 3.4. HTTP 认证适配器 3.4.1. 简介 3.4.2. 设计回顾 ...

    NGUI Next-Gen UI 3.0.7 f1.unitypackage

    - NEW: You can now specify an explicit Render Queue on each panel. - NEW: Improved the Text List's functionality, adding support for touch interaction and having a scroll bar. - NEW: Recreated the ...

    asp.net mvc

    The string “area” in Route values now has special meaning in ASP.NET MVC, in the same way that “controller” and “action” do. One implication is that if ...

    jfinalpluginsjfinal-dreampie.zip

    jfinal-dreampie是一个基于jfinal的开源框架库,主要集成或调优功能如下(由于篇幅原因部分源码未贴出,可以到github下载源码): 1.缓存维护更细粒度  @CacheNameRemove(name = AppConstants.DEFAULT_...

Global site tag (gtag.js) - Google Analytics