Rails Form_for 许多对象的模态
Rails Form_for in modal for many objects
如果有更好的方式来表达问题,或者更好的方式来做到这一点,请告诉我。
我想使用模态 form_for 更新一些模型。用户单击 "edit" 和带有字段的模式弹出窗口,然后可以单击提交或取消。我可以做到这一点的一种方法是为每个模型创建一个模态,但这似乎是错误的,并且确实会增加 html.erb 文件的体积。
我该怎么做?我猜我以某种方式使用了远程功能?
<div class="modal fade" id="edit-modal" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<%= simple_form_for(@rate) do |f| %>
<%= f.label "Rate / session" %>
<%= f.input :rate_dollars, :label => false, collection: 0..100, :selected => @dol_amt, :include_blank => false %>
<%= f.input :rate_cents, :label => false, collection: {".00" => 0, ".25" => 0.25, ".50" => 0.50, ".75" => 0.75}, :selected => @cent_amt, :include_blank => false %>
<%= f.hidden_field :uid, :value => @user.id %>
<%= f.submit "Update", class: "btn btn-primary" %>
<% end %>
</div>
</div>
</div>
我完成它的方法是在索引页面中设置一个模态骨架,然后使用一些 JS 来加载表单,其中控制器操作响应 format.js
部分表单。
<div id="user-form-edit" class="modal fade">
<div class="modal-dialog modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3>Edit User</h3>
</div>
<div class="modal-body"></div>
</div>
</div>
然后在一个JS文件中:
$('#user-form-edit').on("show.bs.modal", function(e) {
$(this).find('.modal-body').load(e.relatedTarget.dataset.url);
});
在控制器中:
def edit
@user = User.find(params[:id])
respond_to do |format|
format.js { render partial: "form", locals: {user: @user}}
end
end
这样,您就有了一个可供所有用户使用的模式。
-- 编辑如何打开模式 ---
<%= link_to "#", class: "btn btn-warning edit",
data: {
toggle: "modal",
url: edit_admin_user_path(user.id),
target: "#user-form-edit"} do %>
<i class="glyphicon glyphicon-edit glyphicon-white"></i>
Edit
<% end %>
考虑使用远程功能 (AJAX) 来实现您想要实现的目标,您走在了正确的轨道上。
首先创建一个空的 div,最终将用 AJAX 查询填充:
<div id="edit-modal" class="modal fade" role="dialog"></div>
接下来更改您的编辑以使用 AJAX 通过将 remote: true 添加到 link 并使用 data-toggle 和 data-target 将其与模式对话框相关联,从而在您的控制器中点击一个动作。
<%= link_to edit_modelinstance(@modelinstance), remote: true, 'data-toggle' => 'modal', 'data-target' => '#edit-modal' do %>
然后创建一个部分,其中包含要添加到之前创建的空 div 中的模态内容。例如,_edit.html.erb
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 id="myModalLabel">Modal Title</h3>
</div>
<div class="modal-body">
<%= simple_form_for(@rate) do |f| %>
<%= f.label "Rate / session" %>
<%= f.input :rate_dollars, :label => false, collection: 0..100, :selected => @dol_amt, :include_blank => false %>
<%= f.input :rate_cents, :label => false, collection: {".00" => 0, ".25" => 0.25, ".50" => 0.50, ".75" => 0.75}, :selected => @cent_amt, :include_blank => false %>
<%= f.hidden_field :uid, :value => @user.id %>
<%= f.submit "Update", class: "btn btn-primary" %>
<% end %>
<div class="modal-footer">
<button class="btn btn-default" data-dismiss="modal" aria-hidden="true">Cancel</button>
<%= f.submit 'Submit', class: 'btn btn-primary' %>
</div>
</div>
</div>
</div>
请注意 div 结构(由 modal-xxxx 的 class 标识的那些部分)对于模态框的正确显示很重要。
现在您只需渲染并填充 div 作为对 AJAX 调用的响应,因此创建一个 js.erb(例如,编辑。js.erb)为您的控制器操作创建文件并向其中添加以下内容。
$("#edit-modal").html("<%= escape_javascript(render partial: 'form') %>");
最后确保您从控制器渲染 js:
format.js
如果有更好的方式来表达问题,或者更好的方式来做到这一点,请告诉我。
我想使用模态 form_for 更新一些模型。用户单击 "edit" 和带有字段的模式弹出窗口,然后可以单击提交或取消。我可以做到这一点的一种方法是为每个模型创建一个模态,但这似乎是错误的,并且确实会增加 html.erb 文件的体积。
我该怎么做?我猜我以某种方式使用了远程功能?
<div class="modal fade" id="edit-modal" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<%= simple_form_for(@rate) do |f| %>
<%= f.label "Rate / session" %>
<%= f.input :rate_dollars, :label => false, collection: 0..100, :selected => @dol_amt, :include_blank => false %>
<%= f.input :rate_cents, :label => false, collection: {".00" => 0, ".25" => 0.25, ".50" => 0.50, ".75" => 0.75}, :selected => @cent_amt, :include_blank => false %>
<%= f.hidden_field :uid, :value => @user.id %>
<%= f.submit "Update", class: "btn btn-primary" %>
<% end %>
</div>
</div>
</div>
我完成它的方法是在索引页面中设置一个模态骨架,然后使用一些 JS 来加载表单,其中控制器操作响应 format.js
部分表单。
<div id="user-form-edit" class="modal fade">
<div class="modal-dialog modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3>Edit User</h3>
</div>
<div class="modal-body"></div>
</div>
</div>
然后在一个JS文件中:
$('#user-form-edit').on("show.bs.modal", function(e) {
$(this).find('.modal-body').load(e.relatedTarget.dataset.url);
});
在控制器中:
def edit
@user = User.find(params[:id])
respond_to do |format|
format.js { render partial: "form", locals: {user: @user}}
end
end
这样,您就有了一个可供所有用户使用的模式。
-- 编辑如何打开模式 ---
<%= link_to "#", class: "btn btn-warning edit",
data: {
toggle: "modal",
url: edit_admin_user_path(user.id),
target: "#user-form-edit"} do %>
<i class="glyphicon glyphicon-edit glyphicon-white"></i>
Edit
<% end %>
考虑使用远程功能 (AJAX) 来实现您想要实现的目标,您走在了正确的轨道上。
首先创建一个空的 div,最终将用 AJAX 查询填充:
<div id="edit-modal" class="modal fade" role="dialog"></div>
接下来更改您的编辑以使用 AJAX 通过将 remote: true 添加到 link 并使用 data-toggle 和 data-target 将其与模式对话框相关联,从而在您的控制器中点击一个动作。
<%= link_to edit_modelinstance(@modelinstance), remote: true, 'data-toggle' => 'modal', 'data-target' => '#edit-modal' do %>
然后创建一个部分,其中包含要添加到之前创建的空 div 中的模态内容。例如,_edit.html.erb
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 id="myModalLabel">Modal Title</h3>
</div>
<div class="modal-body">
<%= simple_form_for(@rate) do |f| %>
<%= f.label "Rate / session" %>
<%= f.input :rate_dollars, :label => false, collection: 0..100, :selected => @dol_amt, :include_blank => false %>
<%= f.input :rate_cents, :label => false, collection: {".00" => 0, ".25" => 0.25, ".50" => 0.50, ".75" => 0.75}, :selected => @cent_amt, :include_blank => false %>
<%= f.hidden_field :uid, :value => @user.id %>
<%= f.submit "Update", class: "btn btn-primary" %>
<% end %>
<div class="modal-footer">
<button class="btn btn-default" data-dismiss="modal" aria-hidden="true">Cancel</button>
<%= f.submit 'Submit', class: 'btn btn-primary' %>
</div>
</div>
</div>
</div>
请注意 div 结构(由 modal-xxxx 的 class 标识的那些部分)对于模态框的正确显示很重要。
现在您只需渲染并填充 div 作为对 AJAX 调用的响应,因此创建一个 js.erb(例如,编辑。js.erb)为您的控制器操作创建文件并向其中添加以下内容。
$("#edit-modal").html("<%= escape_javascript(render partial: 'form') %>");
最后确保您从控制器渲染 js:
format.js