【问题标题】:Rails partial formRails 部分形式
【发布时间】:2014-02-04 23:46:16
【问题描述】:

我有一个通过 Rails 部分呈现的 Bootstrap 模态,我需要与 newedit Rails 视图共享此模态。在这部分中,有一些用户的列表,我需要对其进行检查,当用户保存它时,一个参数会根据用户的选择发送到主视图(新建或编辑)。此外,当从编辑视图中弹出它时,我需要这个部分来拥有已经选择的用户。 那么如何实现呢?

这是它的截图:

我需要在每个用户的选择列下有一个复选框,如果这样称呼它,也将选择的内容发送到“调用者视图”!

我的新视图中的代码

<div class="form-group">
  <%= f.label :members %>
  <span class="glyphicon glyphicon-user"></span>
  <div class="row">
    <div class="col-sm-6">
    <% if user.empty? %>
      <p>Cannot assign memebers<p>
    <% else %>
      <!-- Button trigger modal -->
      <button class="btn btn-primary btn-sm" data-toggle="modal" data-target="#myModal">
        Select Members
      </button>
      <%= render 'layouts/select_user' %>
    <% end %>
    </div>
  </div>
</div>

这里是名为"layouts/_select_user.html.erb"的局部视图

<!-- Bootstrap Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h4 class="modal-title" id="myModalLabel">Select Available Members</h4>
      </div>
      <div class="modal-body">

      <table class="table table-striped">
        <tr>
          <th>Select</th>
          <th>Username</th>
          <th>Job Title</th>
        </tr>

        <% User.where(:manager => false, :admin => false, :locked => false, :company_id => nil).each do |user| %>

        <tr>
          <td><%#= checkbox here  %></td>
          <td><%= link_to user.username.capitalize, edit_admin_user_path(user) %></td>
          <td><%= user.job_title %></td>
        </tr>

        <% end %>
      </table>

      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

【问题讨论】:

  • 如果您询问如何完成此操作,向我们提供一些您尝试过的视图和控制器代码可能会有所帮助。

标签: ruby-on-rails ruby-on-rails-4 partial-views


【解决方案1】:

如果我没听错,您正在尝试更新多个用户对象(通过选中每个用户对象旁边的复选框)。

首先,从 gui 运行查询不是最好的方法,从控制器操作(新建/编辑)填充这些用户对象。然后,您可以通过 :locals 哈希将 User 对象的集合传递给部分:

def new
  @users = User.where(:manager => false, :admin => false, :locked => false, :company_id => nil)
end

<%=render :partial => 'layouts/select_user', :locals => {:users => @users}

现在,在您的部分中,您可以使用 @users 变量,而不是直接调用查询。

复选框参考对我来说似乎很松散。就 User 对象而言,这意味着什么?这个值会改变你的用户对象的含义吗(比如它是一个布尔值,告诉你用户是否属于某种类型:员工、雇主等)。如果是,请在您的用户表中添加一个新字段。您可以将此新字段用于您的复选框。

现在对于更新这些用户,请将@users 对象包含在一个表单中并创建一个控制器操作来处理此更新。当您从模式提交表单时,它会向您发送一个表单对象数组。您可以从控制器操作中迭代这些表单对象并相应地处理对象。

这是一个good example,关于使用多个表单更新多个对象。

还可以查看 Ryan Bates 关于同一主题的 railscast 剧集:
Complex Form 1
Complex Form 2
Complex Form 3

【讨论】:

  • 我需要复选框来选择一些用户,然后将他们添加到组织(组织有一个 has_many 用户的关联)
  • 我的问题是,partial 如何为(新视图和编辑视图)选定用户提供,以便他们使用它们来创建组织或编辑现有组织?
  • 我看了剧集,但我不知道如何在我的特定情况下使用 fields_for,我不需要在 users 表中添加一列只是为了在视图中选择它们,它没有意义,它实际上是一个视图工作,与数据库无关。还要感谢您提供的代码,我重构了视图并将查询移至控制器。
  • 至于您的评论 #2,您的表单将处于部分状态,其提交操作会将表单内容(您更新的选择框)转发给控制器。就像创建/更新操作一样,您需要再创建一个操作来处​​理多个用户对象。
  • 但我不希望这样的事情发生,我会给你一张我的新观点的截图,也许它可以阐明我想要做什么。
【解决方案2】:

没有“调用者”,因为您的模态视图是内联 HTML,因此您应该能够访问模态表单数据

【讨论】:

  • 我需要一种方法来完成我在问题中描述的内容,如何在每个用户旁边添加一个复选框以及部分(模态)如何将选定的用户传递回其父视图?
  • 正如我所说,没有父视图。如果您在“新”视图的 form_tag 中有“render 'layouts/select_user'”,一旦提交表单,partial 中的所有值都将被发送,因此您只需在 partial 中添加 f.check_box。在本地分配中传递表单以从您的部分访问变量
猜你喜欢
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多