这就是我想要做的事情。
当用户点击新笔记时...我希望用户在他们可以开始输入笔记时被带到页面,并使用AJAX将其保存到服务器..
问题是,每次页面保存时,都会发出新的记录。
这让我相信当Rails获得DEF NEW控制器时,我需要一些轨道来首先制作一个新的NOTE记录,然后重定向到该新笔记的编辑控制器,用户可以在其中创建/编辑该笔记所有使用AJAX。
思考?感谢。
答案 0 :(得分:2)
我曾经遇到同样的问题,首先创建笔记可能是一个好主意。
另一种方法是将用户发送到新操作。当第一次保存发生时,您将新对象作为JSON对象发回,并将该表单的操作替换为该记录的更新URL,并将表单的方法设置为put。
这样您就不会在数据库中找到空记录(使用您的用例,您可能需要这样做,因此用户可以稍后继续记录。)
只是我的两分钱。
好的实现方法可能如下所示:
<%= form_for resource,
:remote => true,
:html => { 'id' => 'autosave' },
:url => resources_path(:format => :json) do |f| %>
...
<% end %>
var $form = $('#autosave');
// bind to the first success event from the form
$form.one('ajax:success', function(data, status, xhr) {
// data contains our json object (your note as json)
// now we update the form
$form.attr('action', '/notes/' + data.id);
$form.attr('method', 'put');
$form.attr('data-method', 'put');
});
class ExampleController
...
def create
#
# respond with the json object if format = json,
# see the form above I'm passing the format with :url parameter in form_for
#
respond_with(resource) do |format|
format.json { render :json => resource }
end
end
end
答案 1 :(得分:1)
如果您真的想使用#new创建一个音符并保存它,那么您可以简单地执行
def new
@note = Note.create # instead of Note.new
end
然后,Rails会像#edit动作一样显示此音符,因此音符ID将位于隐藏字段中。然后,当您发送Ajax调用时,您将调用#edit。如果要在关闭javascript时保留#new的行为,则可能需要创建不同的操作。
def new
@note = Note.new
end
def new_js
@note = Note.create
end
当您加载包含new_note链接的页面时,请包含一些更改指向new_js_note的链接的javascript。因此,当JS关闭时,您将获得标准的#new表单。当JS打开时,您将获得一个基本上编辑预先存在的空白笔记的表单。