Search code examples
ruby-on-railscocoon-gem

Coccon Gem Nested Attributes for non binding form


I have a Model Activity

class Activity < ApplicationRecord
  accepts_nested_attributes_for :activity_documents, reject_if: proc { |attributes| attributes[:document].blank? && attributes[:document_title].blank? }, allow_destroy: true
end

Another Model

class ActivityDocument < ApplicationRecord
  mount_uploader :document, DocumentUploader
  belongs_to :activity
end

A Controller Purchase with action Activity

class PurchaseController < ApplicationController
  def activity
    @activity     = Activity.find_by_id(params[:id])
    @activity.activity_documents.build
  end
end

ERB activity.html.erb

  <%= simple_form_for @activity, :url => take_activity_path, :method => :post , html: { class: "exercise-form"} do |f| %>

  <!-- nested attributes start -->
  <section class="show-section">
    <div class="row">
      <div class="col l12"><h4>Documents</h4></div>
      <div class="col s12">
       <%= f.simple_fields_for :activity_documents do |builder| %>
        <% render 'activity_document_fields', f: builder %>
       <% end #f.simple_fields_for%>
         <div class="links">
          <%= link_to_add_association 'Add Documents', f, :activity_documents, class: "btn mb-2" %>
        </div>
      </div>
    </div>
  </section>

<% end %>

_activity_document_fields.html.erb

<div class="nested-fields">
    <div class="row">
        <div class="col l12">
            <%= f.input :document_title %>
            <%= f.hidden_field :user_id, :value => current_user.id  %>  
            <%= f.hidden_field :user_type, :value => current_user.role  %>
        </div>
        <div class="col l8">
            <%= f.input :document %>
        </div>
        <div class="col l1 mt-3">
            <%= link_to_remove_association "delete", f, class: "material-icons teal-text text-lighten-1" %>
        </div>
    </div>
</div>

Now the activity_documents related to this document can be uploaded from two different places. The creation of Activity itself or from the PurchaseController activity.

I need the documents uploaded via activity creation to not be editable / remove-able via the PurchaseController action of activity as there will be two different types of documents and will be uploaded by two different types of users.

Another option may be to only allow new document upload and not allow editing previous ones.


Solution

  • This answer seems to solve my issue.

    We made the following change:

    <section class="show-section">
      <div class="row">
        <div class="col l12"><h4>Documents</h4></div>
        <div class="col s12">
          <%= f.simple_fields_for :activity_documents do |builder| %>
            <% render 'activity_document_fields', f: builder %>
          <% end #f.simple_fields_for%>
          <div class="links">
           <%= link_to_add_association 'Add Documents', f, :activity_documents, class: "btn mb-2" %>
          </div>
        </div>
      </div>
    </section>
    

    to

      <section class="show-section">
        <div class="row">
          <div class="col l12"><h4>Documents</h4></div>
          <div class="col s12">
           <%= f.simple_fields_for :activity_documents, @activity.activity_documents.build do |builder| %>
            <% render 'activity_document_fields', f: builder %>
           <% end #f.simple_fields_for%>
             <div class="links">
              <%= link_to_add_association 'Add Documents', f, :activity_documents, class: "btn mb-2" %>
            </div>
          </div>
        </div>
      </section>