在Rails中使用AJAX link_to渲染部分

时间:2013-11-13 14:46:38

标签: javascript ruby-on-rails ajax ruby-on-rails-4

完成Hartl的教程后,我正在尝试为Micropost模型实现@replies。

我希望微博上的回复按钮能够在所述帖子的下方呈现微博表格。我还想将所述帖子的:micropost_id传递给回复,以便我以后可以参考哪个帖子是回复,再次推特。

我一直在努力根据this question的答案来实现其中一些。

我的微博控制器有

def reply_form

    respond_to do |format|
      format.js
    end
  end

视图中的链接是

<%= link_to 'reply', 'shared/reply_form', remote: true, locals: { object: :id } %>

我尝试传递微博:id

在帖子之后,我将这个部分呈现在:

<div id="ReplyContainer"></div>

然后我有_reply_form.js.erb

$('#ReplyContainer').html('<%=j render partial: 'shared/reply_form', locals: { object: :id } %>')

这不会引发错误,但点击“回复”链接无效,并且不会将_reply_form.html.erb部分呈现。

我的最终目标是点击回复,呈现微博形式,在消息开头的@username(从micropost_id派生?)提交该表单然后保存新的微博,包括原始帖子的微post_id我在microposts表中创建的reply_to列。任何正确方向的推动都非常赞赏。不想咆哮完全错误的树。谢谢。

编辑:点击回复链接时,我目前收到路由错误。

(No route matches [GET] "/shared/reply_form")

但据我所知,一切都在正确的地方。

2 个答案:

答案 0 :(得分:0)

好的,对不起,我刚刚读了你的问题,问题与错误的结构有关。

  • 你有一个控制器,其中包含一个将呈现帖子的动作
  • 您的帖子页面将由“帖子”和许多回复
  • 组成
  • 我猜每个回复都是部分回答(比方说_reply.html.erb文件)。

页面的结构如下:

<div>
 ... my post here...
</div>
<div id='repliesContainer'>
<%- @replies..each do |id| -%>
    <%= render :partial => "shared/reply", :locals => { :object => id} %>
<%- end -%>
</div>

我们称之为post.html.erb

这将是您的shared/_reply.html.erb文件:

  // note here that the id of the div contains the ID of the reply: each ID must be unique in the page....
  <div id='ReplyContainer-#{object}'>
    ...reply content here...
  </div>

现在,您的post.js.erb文件包含以下内容:

$('#repliesContainer').append("<%= escape_javascript( render :partial => 'shared/reply', :locals => { :object => id}) -%>");

append()函数的内容将作为部分字符串在服务器上呈现。

答案 1 :(得分:0)

这里有几个问题:

  1. 正如您所发现的,回复表单的路径不正确。在您修复此问题之前,您将无法调试系统的其余部分。运行rake routes | grep reply_form以查找它的URL(最不可能在/共享下),然后查看该URL的响应。我打赌它会引发错误(见#2)。

  2. 您的回复表单文件名称错误:_reply_form.js.erb是部分名称,但需要为“reply_form.js.erb”。如果您为该控制器点击了正确的路线,您将收到“缺失模板”错误,因为它正在寻找普通模板,而不是部分模板。

  3. 最后,reply_form.js.erb代码需要指向共享的reply_form部分,所以如果真的在shared/_reply_form.html.erb中,则应该正确呈现JS响应。

  4. 话虽如此......我真的不喜欢将Javascript发送回浏览器,部分原因是它让调试JS变得更加困难 - 你如何在浏览器调试器中找到返回的代码?这类设计可能有一些用例,但它们可能非常罕见。

    更好/更多的idomatic解决方案是将JSON数据(例如呈现的文本)发送回浏览器并让一些处理程序解析JSON并更新DOM。这样,您的所有JS代码都存在于浏览器中,您接收的只是数据。这将更容易调试。