在 Rails 中使用 AJAX link_to渲染部分
Rendering partial with AJAX link_to in Rails
完成 Hartl 的教程后,我正在尝试为 Micropost 模型实现@replies。
我希望微帖子上的回复按钮在推特上呈现该帖子下方的微帖子表单。我还想将上述帖子的 :micropost_id 传递给回复,以便我以后可以参考它是回复的帖子,再次是 la 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我在微帖子表中创建的reply_to列。任何朝着正确方向的推动都非常感谢。不想在完全错误的树上吠叫。谢谢。
编辑:单击回复链接时,我目前遇到路由错误。
(No route matches [GET] "/shared/reply_form")
但据我所知,一切都在正确的地方。
好的,对不起,我刚刚更好地阅读了您的问题,问题与错误的结构有关。
- 您有一个控制器,其操作将呈现帖子
- 您的帖子页面将由"帖子"和许多回复组成
- 我猜每个回复都由部分(假设一个
_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()
函数的内容将在服务器上呈现为来自部分的字符串。
你在这里有几个问题:
-
正如您发现的那样,回复表单的路由不正确。在修复此问题之前,您将无法调试系统的其余部分。运行
rake routes | grep reply_form
以查找它的 URL(它很可能不在/shared 下),然后查看该 URL 的响应是什么。我敢打赌它会抛出一个错误(参见#2)。 -
您的回复表单文件的名称错误:
_reply_form.js.erb
是部分,但它需要为"reply_form.js.erb"。如果为该控制器找到正确的路由,则会收到"缺少模板"错误,因为它正在寻找普通模板,而不是部分模板。 -
最后,
reply_form.js.erb
代码需要指向共享reply_form部分,因此如果真的在shared/_reply_form.html.erb
那么 JS 响应应该正确呈现。
话虽如此...我真的很不喜欢将 Javascript 发送回浏览器,部分原因是它使调试 JS 变得更加困难 - 您将如何在浏览器调试器中找到返回的代码?这种类型的设计可能有一些用例,但它们可能非常罕见。
更好/更传统的解决方案是将 JSON 数据(例如渲染的文本)发送回浏览器,并让一些处理程序解析 JSON 并更新 DOM。这样,您的所有JS代码都存在于浏览器中,并且您接收的只是数据。这将更容易调试。
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- jQuery AJAX write to XML
- grep in JQuery to C#
- how to convert html <div> to pdf
- Node.js - POST to iFrame?
- SVG xml to image
- Advantages to DOMParser vs template & innerHTML
- how to split a string with ','
- How to declare a Map containing certain properties with flow
- Php variable obj to js
- 如何在submit to sightly时将表单输入值作为参数传递给WCMUsePojo
- D3JS selectAll to append rect
- Javascript connect to websocket
- Underscore each to update collection
- 在哪里可以找到R-to-JavaScript编译器
- SCEditor BBcode to HTML parsing
- Javascript RegEx to XML Schema RegEx
- How to apply javascript on <asp:Buttonfield>?
- PHP Vars to JavaScript Laravel 5.2
- html image blob to base64