我有一个组列表,我想通过模态编辑一个组名。我使用edit.js.erb文件和bootstrap模式。
有两种情况,都是错误的。
第一: 在Partial和link_to中使用“remote:true”(在单行文件中) 然后显示模态,但点击SAVE按钮后,总是再次渲染,永远不会关闭。 (我不知道为什么)
第二: 删除remote:从partial中删除true。 然后模态显示,我甚至可以保存更改。但是当我键入错误的名称(空白或太长)时,从控制器崩溃中“渲染'编辑'”行。 (错误:“缺少模板组/编辑,应用程序/编辑......”。我认为rails当时不知道edit.js.erb,但是如何修复它?
你对这种情况有什么看法吗?
控制器
def edit
@group = current_user.groups.find_by(id: params[:id])
respond_to do |format|
format.js # actually means: if the client ask for js -> return file.js
end
end
def update
@group = current_user.groups.find_by(id: params[:id])
if @group.update_attributes(group_params)
flash[:success] = "Nazwa grupy została zmieniona"
redirect_to groups_path
else
render 'edit'
end
end
部分用于在模态中显示form_for
<%= form_for(@group, remote: true) do |f| %>
<div>
<%= render 'shared/error2_messages', object: f.object%>
<p>
<%= f.label :name, "Nazwa" %>
<%= f.text_field :name, class: 'form-control'%>
</p>
</div>
<%= f.submit yield(:button_name), class: "btn btn-primary" %>
<% end %>
edit.js.erb文件
<% provide(:button_name, 'Zapisz zmiany') %>
$('.modal-title').html("Edytuj nazwę grupy");
$('.modal-body').html("<%= escape_javascript( render partial: 'layouts/group_data_form', locals: {group: @group} ) %>");
$('#myModal').modal();
列表中的单行
<li id="group-<%= group.id %>" class="list-group-item">
<span class="group-name"><%= group.name %></span>
<%= link_to edit_group_path(group.id), remote: true, :class => "edit-option btn" do %>
<i class="fa fa-pencil-square-o fa-2x" ></i>
<% end %>
<%= link_to group, method: :delete, data: { confirm: "Na pewno chcesz usunąć tę grupę?" }, :class => "delete-option btn btn-danger" do %>
<i class="fa fa-trash-o" > usuń</i>
<% end %>
<!-- Modal -->
<div class="modal fade" id="myModal" 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">Zmień nazwę grupy</h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Anuluj</button>
</div>
</div>
</div>
</div>
答案 0 :(得分:0)
这看起来像是你昨天问题的后续行动。
我不会说你的方法都是错的,我会说你正在以这种方式结合两种正确的方法......
(1)因为您使用js
发送保存(在表单上使用remote: true
),所以您需要做的就是关闭成功保存的模式,因为将定义update.js.erb
(就像您为编辑中的edit.js.erb
定义了format.js
),如下所示:
#update.js.erb
<% if @group.errors.empty? %>
$('.modal-body').html("");
$('#myModal').modal('hide');
$("#notice").html("Group was successfully updated.");
<% else %>
$("#notice").html("Error! Group not updated.");
<% end %>
#controller update action
def update
@group = current_user.groups.find_by(id: params[:id])
@group.update_attributes(group_params)
respond_to do |format|
format.html
format.js
end
end
你在这里做的是检查@group
对象中是否没有错误(如果@group被保存,这将是真的),然后清空你的模态,然后从视图中隐藏它。
(2)当您移除remote: true
后,您不再使用js
,因此当您输入错误名称时,更新无效,并且render :edit
部分{ {1}}方法启动。但是,您的update
操作仅指定edit
,因此,在这种情况下您可能需要添加format.js
,如果您想使用{ {1}}。
format.html
但请注意,这可能无法打开您的模式,它会转到您应用的html
,即def edit
@group = current_user.groups.find_by(id: params[:id])
respond_to do |format|
format.js # actually means: if the client ask for js -> return file.js
format.html
end
end