Rails表单包含各个表单

时间:2016-07-08 03:31:32

标签: ruby-on-rails ruby

考虑这个设置。在我的Blogs#index页面中,我可以更新每个博客记录。这是它的样子:

blogs index

以下是代码:

<h1>Listing Blogs</h1>

<div class="row">
  <div class="col-sm-4"><b>ID</b></div>
  <div class="col-sm-4"><b>Title</b></div>
  <div class="col-sm-4"><b>Actions</b></div>
</div>

<% @blogs.each do |blog| %>
  <%= form_for(blog) do |f| %>
    <div class="row">
      <div class="col-sm-4">
        <%= blog.id %>
      </div>
      <div class="col-sm-4">
      <%= f.label :title %>
      <%= f.text_field :title %>
      </div>
      <div class="col-sm-4">
        <%= f.submit class: "btn btn-success" %>
      </div>
    </div>
  <% end  %>
  <br>
<% end  %>

<%= link_to 'New Blog', new_blog_path %>

还不错。但是现在我要做的是添加一个包装这些表单的表单。此表单允许您选择所需的博客对象,然后发布到某个控制器,抓取您选择的每个博客记录的id

select_box

以上只是一个模拟。我不知道如何实际做到这一点,这就是问题所在。

这个想法是用户可以提交两种形式:

  • 包装表单,该表单发布了所选ids的{​​{1}}
  • 或其中一个包装的表单,只会转到您要更新的单个博客记录的blogs操作。

由于我无法在其他表单中嵌套表单,我能想到的唯一方法是使用javascript:

  • 包装表单的按钮变为ajax请求
  • 点击Blogs#update按钮后,使用javascript查看每个已选中复选框的关联Do something with selected blogs的内容,将其添加到数组中,然后同时调用blog id请求get作为参数。

我非常希望不使用javascript。有没有什么方法可以保持相同的布局而不使用javascript,这将允许我发布到包装的表单,但也发布任何个人表单在那个包裹的形式里面?

3 个答案:

答案 0 :(得分:0)

也许最简单的答案是为每个项目提供重复的字段(取决于您需要的内容)并将副本设置为隐藏。然后,您需要编写的javascript是在您关注的任何字段发生更改时将数据从非隐藏表单复制到隐藏表单中。通过这种方式,您可以将第二个表单放在上面的表单下面,它就像它的按钮一样,就像在您的模型中一样。

答案 1 :(得分:0)

尚未经过测试:

#routes
post "update_all" => "blogs#update_all"

#view
<%= form_tag "/update_all", method: "post" do %>
  <% @blogs.each do |blog| %>
    <%= form_for @blog do |f| %>
      <div class="row">
        <div class="col-sm-3">
          <%= select_tag "blog_ids[]", blog.id %>
        </div>
        <div class="col-sm-3">
          <%= blog.id %>
        </div>
        <div class="col-sm-3">
          <%= f.label :title %>
          <%= f.text_field :title %>
        </div>
        <div class="col-sm-3">
          <%= f.submit "Update Blog", class: "btn btn-success" %>
        </div>
      </div>
    <% end %>
  <% end %>
<%= submit_tag "Do something with selected blogs", class: "btn btn-primary" %>

#controller
def update
  #your standard update
end

def update_all
  #handle update all
end

我会检查服务器日志以查看整体传递的内容,并编写一个自定义强参数函数来筛选它。

答案 2 :(得分:0)

我得到了它的工作。对我来说,关键是不要嵌套表格。相反:我只是将两个类型的表单并排放置。我是通过使用bootstrap的网格系统完成的。

outlining seperate forms

这是代码。请注意,它确实使用引导程序进行样式设置:

<h1>Listing Blogs</h1>

<div class="row">
  <div class="col-sm-3">
    <p>Select</p>
      <%= form_tag do_something_blogs_path  do %>
        <% @blogs.each do |blog| %>
          <div>
            <%= check_box_tag "blog_ids[]", blog.id, false %>
          </div><br>
        <% end  %>
        <%= submit_tag "Do Something with Selection" %>
      <% end  %>
  </div> 
  <div class="col-sm-9">
    <div class="row">
      <div class="col-sm-4"><p>ID</p></div>
      <div class="col-sm-4"><p>Title</p></div>
      <div class="col-sm-4"><p>Actions</p></div>
    </div>
    <div class="row">
      <% @blogs.each do |blog| %>
        <%= form_for(blog) do |f| %>
          <div class="col-sm-4">
            <%= blog.id %>
          </div>
          <div class="col-sm-4">
            <%= f.label :title %>
            <%= f.text_field :title %>
          </div>
          <div class="col-sm-4">
            <%= f.submit class: "btn btn-success" %>
          </div>
        <% end  %>
        <br><br>
      <% end  %>
    </div>
  </div> 
</div>

<%= link_to 'New Blog', new_blog_path %>