Rails - 索引站点上的模态编辑失败

时间:2015-11-21 12:58:00

标签: ruby-on-rails twitter-bootstrap

我有一个组列表,我想通过模态编辑一个组名。我使用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">&times;</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>

1 个答案:

答案 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