我对编程和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">×</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。
答案 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