Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails 5 form_标记具有原始DB值,在表单中进行新选择后,必须更新两条记录_Ruby On Rails_Forms_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails rails 5 form_标记具有原始DB值,在表单中进行新选择后,必须更新两条记录

Ruby on rails rails 5 form_标记具有原始DB值,在表单中进行新选择后,必须更新两条记录,ruby-on-rails,forms,ruby-on-rails-5,Ruby On Rails,Forms,Ruby On Rails 5,我有一个表单标签和一个单选按钮标签,它用数据库中的数据填充。它必须直接指向一个定制的更新操作(update\u multiple),在该操作中,一个布尔列将针对表单中已更改的所有2条记录进行更新 例如,当最初从DB填充表单时,选择了记录1的单选按钮,现在用户将其选择更改为记录3,则在提交表单标签时,必须更新两个记录,但问题是提交时的代码,仅收集当前在该组中选中的记录的id。如何获取未选中的记录的id,以便一次更新两个记录的所有id 如果Submit无法处理此操作,那么在控制器或表单中是否有方法在

我有一个表单标签和一个单选按钮标签,它用数据库中的数据填充。它必须直接指向一个定制的更新操作(update\u multiple),在该操作中,一个布尔列将针对表单中已更改的所有2条记录进行更新

例如,当最初从DB填充表单时,选择了记录1的单选按钮,现在用户将其选择更改为记录3,则在提交表单标签时,必须更新两个记录,但问题是提交时的代码,仅收集当前在该组中选中的记录的id。如何获取未选中的记录的id,以便一次更新两个记录的所有id

如果Submit无法处理此操作,那么在控制器或表单中是否有方法在填充表单之前保留初始选定记录的id?如您所见,我已经尝试收集带有单选按钮标记的ID[]数组

谢谢你的帮助

以下是表格代码:

<%= form_tag update_multiple_user_cv_attachments_path, method: :put, action: :update_multiple do %>
      <table class="table table-bordered table-striped">
        <thead>
          <tr>
            <th> Select a CV </th>
            <th> Resume Name </th>
          </tr>
        </thead>
        <tbody>
        <% @cv_attachments.each do |cv_attachment| %>
        <%= hidden_field_tag cv_attachment.main, :value => params[:main] %>
          <tr>
            <td><%= radio_button_tag "cv_attachment_ids[]", cv_attachment.id, cv_attachment.main %> </td>
            <td><%= cv_attachment.attachment.file.basename %></td>
          </tr>
        <% end %>
        </tbody>
      </table>
      <br>
      <%= submit_tag "Select Main", :class =>'button' %>
     <% end %>

结束

我可以想出两种方法来实现你的目标

  • 将属于用户的所有附件的布尔值更新为false,然后将已选择的附件更新为true
  • 在表单中包含隐藏字段,并将其设置为已为true的id。然后在控制器操作中,将选中的更新为true,将隐藏字段中的更新为false。这可能是一个更好的选择,您可能希望在事务中包装d/b更新

    <tbody>
      <% @cv_attachments.each do |cv_attachment| %>
        <% if cv_attachment.main %>
          <%= hidden_field_tag "ex_main_cv", cv_attachment.id %>
        <% end %>
        <tr>
          <td><%= radio_button_tag "main_cv", cv_attachment.id, cv_attachment.main %> </td>
          <td><%= cv_attachment.attachment.file.basename %></td>
        </tr>
      <% end %>
    </tbody>
    

    非常感谢@margo。下面是我如何解决这个问题的一部分,你使用隐藏字段的方式。但现在保持这个线程打开,因为我正在为同一列的切换进行2 DB的更新

    <tbody>
              <% @cv_attachments.each do |cv_attachment| %>
                <% if cv_attachment.main %>
                    <%= hidden_field_tag "ex_main", cv_attachment.id %>
                <% end %>
                <tr>
                  <td><%= radio_button_tag "new_main", cv_attachment.id, cv_attachment.main, :id => "#{cv_attachment.id}"%> </td>
                  <td><%= cv_attachment.attachment.file.basename %></td>
                </tr>
              <% end %>
            </tbody>
    

    任何一个或几个线性代码,以便与数据库的交互是最小的??切换!也可以用来更新更新的属性。因为它只需要更新2条记录的布尔状态,调用更新属性或切换!每一次,都不是一个非常有效的解决方案。如果要持久化操作,则必须与数据库交互。你有什么建议?如果您的意图不是持久化用户的操作,那么可以使用javascript切换值,并可能触发ui更改。
    def update_main_attachment // probably a better name for this method
      if params["ex_main_cv"] != params["main_cv"]
        Attachment.transaction do
          deselected_attachment = Attachment.find(params["ex_main_cv"]
          deselected_attachment.update_attribute(:main, false)
          selected_attachment = Attachment.find(params["main_cv"]
          selected_attachment.update_attribute(:main, true)
        end
      end
    end
    
    <tbody>
              <% @cv_attachments.each do |cv_attachment| %>
                <% if cv_attachment.main %>
                    <%= hidden_field_tag "ex_main", cv_attachment.id %>
                <% end %>
                <tr>
                  <td><%= radio_button_tag "new_main", cv_attachment.id, cv_attachment.main, :id => "#{cv_attachment.id}"%> </td>
                  <td><%= cv_attachment.attachment.file.basename %></td>
                </tr>
              <% end %>
            </tbody>
    
    def update_main
    if request.put?
      if params["ex_main"] != params["new_main"]
        CvAttachment.find(params[:ex_main]).toggle!(:main)
        CvAttachment.find(params[:new_main]).toggle!(:main)
      end
    end