Rails 4 - 在不同控制器的bootstrap模式中创建一条新记录

时间:2015-12-17 19:22:19

标签: ruby-on-rails ruby-on-rails-4 crud bootstrap-modal

我对编程和Rails相对较新,我一直在玩一个想法,没有太大的成功,并且在这里,railscasts或论坛上找不到任何答案,所以我转向社区!所以这就是问题所在:

出于问题的目的,我有两个模型:供应商和供应商报价:

class Supplier < ActiveRecord::Base
has_many :supplier_quotes

class SupplierQuote < ActiveRecord::Base
belongs_to :supplier

当我创建新的供应商报价时,会有一个下拉列表,用户可以从中选择与该报价相关联的供应商,其中包含:

    <%=  f.select(:supplier_id, @supplier_select.map {|supplier| [supplier.name, supplier.id]}, include_blank: true) %>

如果供应商尚不存在,而不是转到另一页创建记录并返回,我想要一个模式,其中新供应商的表格将会出现。所以我的下拉列表旁边有这个链接:

<%=  link_to "Add Supplier", '#supplierModal', class: 'small-link', "data-toggle" => "modal" %> 

其模式:

<div class="modal fade" id="supplierModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
    <h4 class="modal-title" id="myModalLabel">Add Supplier</h4>
  </div>
  <div class="modal-body">

   <%= form_for(@supplier, url: {controller: 'suppliers', action: 'remote_create'} ) do |f| %>

   <h3 class="edit-title">Contact details</h3>
    <table class="pretty editlist">

      <tr>
      <th><%=  f.label(:name) %></th>
      <td><%=  f.text_field(:name) %></td>
      </tr>

      <tr>
      <th><%=  f.label(:no_street, "Address") %></th>
      <td><%=  f.text_field(:no_street) %></td>
      </tr>

      <tr>
      <th><%=  f.label(:city) %></th>
      <td><%=  f.text_field(:city) %></td>
      </tr>

      <tr>
      <th><%=  f.label(:country) %></th>
      <td><%=  f.text_field(:country) %></td>
      </tr>
    </table>


    <h3 class="edit-title">Banking details</h3>
    <table class="pretty editlist">

      <tr>
      <th><%=  f.label(:bank, "Bank") %></th>
      <td><%=  f.text_field(:bank) %></td>
      </tr>

      <tr>
      <th><%=  f.label(:IBAN, "IBAN") %></th>
      <td><%=  f.text_field(:IBAN) %></td>
      </tr>

      <tr>
      <th><%=  f.label(:BIC, "SWIFT/BIC") %></th>
      <td><%=  f.text_field(:BIC) %></td>
      </tr> 
    </table>

   <div class="form-button">
     <%= submit_tag("Save") %>
  </div>

  <% end %>

  </div>
  <div class="modal-footer">
    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
  </div>
</div>

现在我创建了一个动作'remote_create',以便不会将它与经典方式中使用的创建动作混合起来。

def remote_create
@supplier = Supplier.new(supplier_params)
  if @supplier.save
    redirect_to controller: 'supplier_quotes', action: 'new'
  end  
end

最后在supplier_quotes_controller中的'new'操作中,我有以下行,允许在供应商报价'新'视图的模式中生成供应商创建表单:

@supplier = Supplier.new

这显然不起作用,但更大的问题是,当我在模态中提交表单时,不仅没有创建供应商记录,而且提交了供应商报价记录并使用空白字段创建。所以不是预期的行为。

有谁知道我会如何解决这个问题?这是form_for或动作的问题吗?..

次要问题:在模式中创建表单后,我使用redirect_to到我已经在的页面(supplier_quotes,'new')来刷新它,因为我希望新记录显示在落下。如果有一种方法可以动态更新下拉列表,那么我只需要在不刷新任何页面的情况下使模态消失。这可能吗?

希望我足够清楚!谢谢你的帮助!!

最佳。

A.M。

1 个答案:

答案 0 :(得分:0)

问题1: 我的一般策略是这样的:确保所有的管道连接,然后做一些花哨的东西。因此,在创建工作之前,抛弃模态并且只是担心从供应商报价视图创建供应商。然后,对模态有所了解。

使用form_for操作,只需使用“经典”创建路径,而不必担心定义新路径。在供应商视图中引用为您生成的rails的供应商脚手架(可能在new.html.erb文件和_form.html.erb部分)。您甚至可以从供应商视图文件夹中呈现rails生成的部分,而不是再次写出表单。

问题2: 然后,当第一部分正确创建(但仍然不按照您想要的方式重定向)时,您可以查看在后台提交的远程表单。将创建资源,您可以定义在成功创建操作后要更新的页面(下拉菜单)。

在此处阅读远程表单:http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html#form-for