rails 5 form_tag with original DB value and after new selection in form, both records must be updated

天大地大妈咪最大 提交于 2019-12-25 04:26:15

问题


I have a form_tag with a radio_button_tag and it populates with data from DB. It must simply be directed to a customised update action(update_multiple) where a boolean column is updated for all those 2 records which have been changed in the form.

For e.g. say when initially the form was populated from DB with record 1's radio button selected and now user changed his selection to record 3, then at Submit of form tag the update of both records must occur but the problem is the code at submit, only collects id of record which is now selected in that group.How do I get id of that record also which was unselected so that I can update_all for both of them at one go?

And if Submit cannot handle this action, then is there a way in controller or form to persist the id of the initial selected record before populating the form? As you see, I've tried with collecting an array of ids[] with radio_button_tag.

TIA for your help.

Here's the form code:

<%= 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 %>

Here's the controller update_multiple code.

def update_multiple
CvAttachment.update_all(["updated_at=?", Time.now], :id => params[:cv_attachment_ids])

end


回答1:


I can think of 2 ways to achieve your objective.

  1. update the boolean for all the attachments which belong to the user to false and then update the one which has been selected to true
  2. include a hidden field in the form and set it to the id that is already true. Then in the controller action, update the one that is selected to true and the one in the hidden field to false. This is probably a better option and you'll probably want to wrap the d/b updates in a transaction.

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

controller

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



回答2:


Many thanks @margo. Here' how I resolved it partly your way of using hidden_field. But for now keeping this thread open as I'm making 2 DB updates for toggle of same column.

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

and in controller:

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


来源:https://stackoverflow.com/questions/41457718/rails-5-form-tag-with-original-db-value-and-after-new-selection-in-form-both-re

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!