Ruby on Rails:在ajax提交后形成问题

时间:2015-06-30 20:32:09

标签: jquery ruby-on-rails ruby ajax forms

我遇到了rails forms(remote:true)及其操作的问题。 我正在使用Rails 4。

我有两个部分。首先是包含所有条目的表(例如工作包),其次是添加新条目的表单。我填写表格并通过AJAX发送给我的控制器。之后,表单partial将重新呈现。到目前为止一切都很好。

现在问题是表单处于“编辑模式”:

<form accept-charset="UTF-8" action="/workpackages/290"   class="edit_workpackage" data-remote="true" id="edit_workpackage_290" method="post" role="form">

如果我想直接添加另一个工作包,那么这是不可能的,因为我会更改第一个entrie。

如何在创建后确保公式处于“新模式”?

<form accept-charset="UTF-8" action="/workpackages" class="new_workpackage" data-remote="true" id="new_workpackage" method="post" role="form">

可以说我想要哪种表格模式吗?如果我按下“编辑”按钮,应始终可以使用“编辑模式”。

如果我刷新整个表格,表格在“新模式”中是新的。为什么不在ajax之后召唤?

一些代码:

控制器/创建

def create
    respond_to do |format|
      if (@workpackage.save)

        #update current working time on workingtime Account
        update_workingtime_account()

        #get new infos about workingtime from current day and working   account if a new workpackage was created 
        get_new_workingtime()

        flash[:notice] = 'Arbeitspacket erfolgreich erfasst'
        format.html { redirect_to @workpackage }
        format.js {}

      else

        format.html { render :new }
        flash[:notice] = 'Arbeitspacket konnte nicht gespeichert werden'
        format.js {}
      end
    end

create.js.erb

//AJAX renew Section table
$(document).ready(function() {  
$('#workpackage-form').bind('ajax:success', function() {

    $('#workpackage-table').html("<%= escape_javascript(render 'workpackages/table') %>");

    $('#workpackage-form').html("<%= escape_javascript (render partial: 'workpackages/form') %>");

    //re-initialize datetimepicker
    $('.datetimepicker').datetimepicker({ format: 'LT' });

}); 

});

我希望解释清楚。

1 个答案:

答案 0 :(得分:0)

Rails自动决定是创建新记录还是为模型更新现有记录,具体取决于其状态(是否持久)。

您不包含表单代码,但我猜您的内容类似于以下内容:

<%= form_for @workpackage do |f| %>
   ...
<% end %>

当您第一次成功提交表单时,表单会在create操作的上下文中重新呈现,因此@workpackage是一个持久对象,它会尝试更新它

如果您始终希望使用该表单进行创建,则可以执行此替换:

<%= form_for Workpackage.new do |f| %>
  ...
<% end %>

如果您还允许通过相同的表单进行编辑,则常见的模式是将form_for行从表单部分中取出并将表单对象传递给partial。

<强> new.html.erb

<%= form_for Workpackage.new do |f| %>
  <%= render 'form', f: f %>
<% end %>

<强> edit.html.erb

<%= form_for @workpackage do |f| %>
  <%= render 'form', f: f %>
<% end %>

<强> _form.html.erb

<%= f.text_field :one %>
<%= f.text_field :two %>
...