我有一个评论模型,我希望人们能够保存草稿。它有一个布尔属性“draft”,允许保存注释(但尚未显示)。我正在为这些评论创建一个自动保存功能。
Comment表单current的运行方式如下:变量@comment由控制器初始化为@comment = Comment.new。然后评论的表格是:
<%= form_for @comment, :remote => true do |f| %>
<%= f.text_area :title, :class => "inputform" %>
<%= f.text_area :content, :class =>"inputform" %>
<%= f.submit "Submit", :class => "button" %>
<% end %>
所以,正如我所说的,我想让它自动保存。为了开始完成它,我写了这个autosave_comments.js文件:
$(document).ready(function(){
setInterval(function() {
$('new_comment .temp').html('<input type="hidden" name="comment[draft]" id="comment_draft" value="true" />');
$('#comment_form form[data-remote]').submit();
$('new_comment .temp').html('');
}, 10000);
});
此代码将draft的输入设置为true,提交表单,然后删除该草稿的输入。此代码非常有用,因为它提交表单并将草稿保存到控制器。但是,每次提交都会保存一个新条目(即每隔10秒将新评论作为草稿保存在数据库中),而不是更新第一个条目。
最后一点背景:当表单提交给评论控制器时,它会提交给创建操作:
def create
@comment = params[:comment]
if @post.save
if params[:draft]
flash.now[:notice] = "draft autosaved"
else
flash.now[:success] = "comment created"
end
else
#code to output errors
end
respond_to do |format|
format.html
format.js
end
end
然后引用create.js.erb文件:
<% post = user.posts.last %>
<% if post.draft == false %>
//code here deals with a true submission of a comment, to append tables etc.
<% else %>
//maybe some code here could alter the form on draft submission to make it update the same post next time?
<% end %>
所以我想知道,我希望第一份草稿提交工作,并在评论表中创建一个条目。但是,我希望表单在后续自动保存时更新该评论,并在该人提交评论以进行发布时将评论保存为非草稿最终评论。我在其中一个文件中是否有某个位置可以完成此任务?
谢谢!
答案 0 :(得分:3)
在create.js.erb
:
$('#comment_form').attr('action', '<%= comment_path(@comment) %>');
只需确保您的评论表单的ID为comment_form
,否则相应地更改jQuery对象。 Rails应该处理其余的事情。
编辑我忘了你还需要像Rails一样伪造PUT请求。由于某些浏览器不支持PUT请求,因此rails使用POST,然后添加隐藏的表单字段:
<input name="_method" type="hidden" value="put" />
所以只需在create.js.erb
:
$('#comment_form').append('<input name="_method" type="hidden" value="put" />');