Rails - 调用NEW时,在显示表单之前创建一条记录?

时间:2010-10-26 01:18:32

标签: ruby-on-rails ruby-on-rails-3

这就是我想要做的事情。

当用户点击新笔记时...我希望用户在他们可以开始输入笔记时被带到页面,并使用AJAX将其保存到服务器..

问题是,每次页面保存时,都会发出新的记录。

这让我相信当Rails获得DEF NEW控制器时,我需要一些轨道来首先制作一个新的NOTE记录,然后重定向到该新笔记的编辑控制器,用户可以在其中创建/编辑该笔记所有使用AJAX。

思考?感谢。

2 个答案:

答案 0 :(得分:2)

我曾经遇到同样的问题,首先创建笔记可能是一个好主意。

另一种方法是将用户发送到新操作。当第一次保存发生时,您将新对象作为JSON对象发回,并将该表单的操作替换为该记录的更新URL,并将表单的方法设置为put。

这样您就不会在数据库中找到空记录(使用您的用例,您可能需要这样做,因此用户可以稍后继续记录。)

只是我的两分钱。

好的实现方法可能如下所示:

表格

<%= form_for resource, 
             :remote => true, 
             :html => { 'id' => 'autosave' }, 
             :url => resources_path(:format => :json) do |f| %>
  ...
<% end %>

Application JS

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打开时,您将获得一个基本上编辑预先存在的空白笔记的表单。