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

我想在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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值