我刚刚开始学习Rails,我与内置工具,Javascript和AJAX相处得很好,但对我来说却是一个新手。这是问题所在:
我有一张订单。每个订单都属于一个联系人,可以有不同的结算和送货地址。 collection_select框用于设置这些值。如果我不介意必要的页面重新加载以减少可用的地址选项(这应该仅限于属于所选联系人的地址),所有这些都可以正常工作。
在没有页面重新加载的情况下,使这项工作最简单,最容易维护的选项是什么?
这就是我在卡住之前尝试对表单进行ajax化的内容。让我们从 views / orders / edit.html.erb :
的摘录开始<%= nested_form_for @order, remote: true do |f| %>
...
<%= f.label :contact_id, "Händler" %>
<%= f.collection_select(:contact_id, Contact.order(:name), :id, :name) %>
<%= f.label :billing_address_id, "Rechnungsanschrift" %>
<%= f.collection_select(:billing_address_id, Address.where(contact_id: @order.contact_id), :id, :name) %>
...
<% end %>
我省略了送货地址选择框,因为它与结算下拉列表相同。我们暂时只关注它。
以下是 controllers / orders_controller.rb 中的更新操作:
def update
@order = Order.find(params[:id])
respond_to do |format|
if @order.update_attributes(order_params)
format.html { redirect_to edit_order_path, notice: "Auftrag aktualisiert." }
format.json { render json: @order }
format.js
else
render 'edit'
end
end
end
我尝试查看联系人选择框以进行更改,以便立即保存,希望地址选择也会立即反映这些更改。此观察者位于 assets / javascript / orders.js.erb :
中$('#order_contact_id').change(function() {
$(this).parents('form:first').submit();
});
那时我希望这已经足够了,数据已经保存了,但显然Rails希望我在 views / orders / update.js.erb 中定义一些进一步的说明 - 这里我无奈。这就是我想出的:
$('#order_billing_address_id').replaceWith('<%= escape_javascript(collection_select(:order, :billing_address_id, Address.where(contact_id: @order.contact_id), :id, :name)) %>');
order_billing_address_id是帐单邮寄地址的collection_select框的ID,我基本上只想刷新内置的rails collection_select标签。
这实际上是有效的 - 如果我选择一个不同的联系人,地址框会立即填充其各自的地址 - 但是只有当联系人没有多个关联地址时。当我选择具有多个地址选项的联系人时,地址选择框会粘贴上一个只有一个地址的联系人的选项。如果我手动刷新页面虽然显示正确的值,即使对于具有多个地址的联系人也是如此。所以数据肯定会被保存,这告诉我 update.js.erb 可能是问题所在。
我在选择各种联系人的同时观看了rails dev服务器的输出,并且数据似乎得到了处理,保存和检索 - 我无法确定单地址联系人和多个联系人之间的那些服务器日志的差异-address触点。根据这些日志,查询和检索到的记录ID和集合按预期匹配。
我在这里做错了什么?或者更一般地说,对于我正在尝试做的事情,是否有更好的方法/实践?请记住,我是Rails的新手,甚至更多的Javascript。非常感谢您的帮助。