0

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

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

我一直在尝试根据这个问题的答案来实现其中的一些。

我的微博控制器有

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 表中创建的。任何朝着正确方向的推动都非常感谢。不想吠叫完全错误的树。谢谢。

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

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

但据我所知,一切都在正确的位置。

4

2 回答 2

0

你在这里有几个问题:

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

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

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

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

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

于 2013-12-03T04:24:54.043 回答
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()函数的内容将在服务器上呈现为来自部分的字符串。

于 2013-11-13T15:01:20.177 回答