完成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")
但据我所知,一切都在正确的地方。
答案 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)
这里有几个问题:
正如您所发现的,回复表单的路径不正确。在您修复此问题之前,您将无法调试系统的其余部分。运行rake routes | grep reply_form
以查找它的URL(最不可能在/共享下),然后查看该URL的响应。我打赌它会引发错误(见#2)。
您的回复表单文件名称错误:_reply_form.js.erb
是部分名称,但需要为“reply_form.js.erb”。如果您为该控制器点击了正确的路线,您将收到“缺失模板”错误,因为它正在寻找普通模板,而不是部分模板。
最后,reply_form.js.erb
代码需要指向共享的reply_form部分,所以如果真的在shared/_reply_form.html.erb
中,则应该正确呈现JS响应。
话虽如此......我真的不喜欢将Javascript发送回浏览器,部分原因是它让调试JS变得更加困难 - 你如何在浏览器调试器中找到返回的代码?这类设计可能有一些用例,但它们可能非常罕见。
更好/更多的idomatic解决方案是将JSON数据(例如呈现的文本)发送回浏览器并让一些处理程序解析JSON并更新DOM。这样,您的所有JS代码都存在于浏览器中,您接收的只是数据。这将更容易调试。