Rails - 通过bootstrap模式从列表中编辑项目

时间:2015-11-20 21:05:35

标签: ruby-on-rails twitter-bootstrap

我是Rails的新手。我尝试制作一个组列表(/groups),我想在每行中编辑和删除选项。编辑应该通过模态实现,因为Group只有一个属性 - name。所以我不想打开/groups/number/edit

我的问题是:我不知道如何将所选群组与form_for绑定。也许这不是一个好方法。 显示模态,但名称字段为空。当我使用@group的调试时也是空白的。我不知道为什么。

这是我的代码(单组行):

<li id="group-<%= group.id %>" class="list-group-item">
<span class="group-name"><%= group.name %></span>

<%= link_to edit_group_path(group.id), "data-toggle" => "modal", "data-target" => "#myModal", :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>
            <%= form_for(@group) do |f| %>
                <div class="modal-body">
                    <%= debug @group %>
                    <p>
                        <%= f.label :name, "Nazwa" %>
                        <%= f.text_field :name, class: 'form-control'%>
                    </p>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Anuluj</button>
                    <%= f.submit "Zapisz zmiany", class: "btn btn-primary" %>
                </div>
            <% end %>
        </div>
    </div>
</div>

控制器

def edit
@group = current_user.groups.find_by(id: params[:id])
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
   redirect_to groups_path
 end
end

1 个答案:

答案 0 :(得分:1)

我会假设上述问题的答案是肯定的,所以,我会继续回答。

首先:您不想为每个组重复不同的模态,您只希望所有组都使用单个模态。

第二件事:你想要将group.id发送到控制器中的编辑方法,以便将该组返回到你的模态

,这是非常正确的。

然而,问题在于你是如何努力实现这一目标的。

<%= link_to edit_group_path(group.id), "data-toggle" => "modal", "data-target" => "#myModal", :class => "edit-option btn" do %>

点击后,您告诉您的链接执行两项操作:(1)go to edit path(2)open modal。哪一个会更重要?现在,它是打开的模式,而不是编辑路径工作,这意味着你根本没有进入控制器,所以要考虑你的@group为空的原因。

要实现这一点,你必须告诉你的链接只做一件事,当成功时,做另一件事。

我的建议是在链接上使用Ajax(通过设置remote: true)转到控制器,然后在响应时打开模式。

以下是步骤细分:

1.设置remote: true以使用Ajax进行调用

<%= link_to edit_group_path(group.id), remote: true %>

2.Tell控制器操作(在这种情况下,edit操作)以响应js

def edit
  @group = current_user.groups.find_by(id: params[:id])
  format.js
end
  1. 准备一个edit.js.erb文件来处理响应(这将与您的其他视图文件位于同一目录中)

  2. 使用来自回复

  3. 内的@group填充表单
  4. 将填充的表单放入模态
  5. 使用Javascript显示模态

    $('.modal-title').html("Edit Group")
    $('.modal-body').html("<%= escape_javascript( render partial: 'form', locals: {group: @group} ) %>")
    
    $('#myModal').modal()
    
  6. 尽可能简单直接。希望这会有很大的帮助。