+1 for what Ben said.  Another piece for the puzzle can be attribute
accessors.  For example if I had a User and a user had many categories, I
might have a methods on user like so

class User < ActiveRecord::Base
  ...
  def category_names
    self.categories.map &:name
  end

  def category_names=(values)
    values.each do |v|
      self.category_users.include(:category).where(category.name:
v).first_or_create
    end
  end

  ...
end

Rob

On Mon, Jan 23, 2017 at 11:27 AM Ben Wanicur <[email protected]> wrote:

> Look like you have some nested attributes there.  My rule of thumb is that
> if the form seems very deadpan simple AND not likely to change very much,
> you can try to solve the issue using accepts_nested_attributes_for only (
> http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html).
>
>
> However, if the form even has even a hint of complexity, or might become
> more complex in the future, I'd use form objects  (
> https://robots.thoughtbot.com/activemodel-form-objects).  I use these 2
> libraries and I can pretty much "fake" almost any form object:
>
> - https://github.com/solnic/virtus
> - http://api.rubyonrails.org/classes/ActiveModel/Model.html
>
> You can use form objects to manage the inputs validation and
>  parameters-massaging, or whatever else you might want, but I recommend
> using a service object to handle the actual submitting of the form.
> Whenever I try to force complex things into accepts_nested_attributes_for,
> I usually spend a few hours sobbing quietly in the corner.
>
> Good luck!
>
>
> Ben W
>
> On Mon, Jan 23, 2017 at 11:07 AM Hillary Hueter <[email protected]>
> wrote:
>
> I'm Not Sure How To Implement this form.
>
> I'm setting up a Tournament Management app. When a User Creates a
> Tournament they pick the contact methods that the tournament will use for
> contacting participants. This List is defined by the Values seeded into
> Contact Methods. When another User Registers for the Tournament, They Can
> Pick From any of the Tournament's Contact Methods and if neccessary provide
> optional information.
>
> I'm not really sure how to setup the form but what i want it to look like
> this:
>
>
> <https://lh3.googleusercontent.com/-soN19ipHYyc/WIZTVWtYmZI/AAAAAAAAAXw/LaPPNZm5FfcmGlG1VZ0T-6AOP4hsl4egwCLcB/s1600/Desired%2BForm.PNG>
>
>
>
> My Code
>
> *Models*
>
> class ContactMethod < ActiveRecord::Base
>     has_and_belongs_to_many :tournaments
>     has_and_belongs_to_many :registrations
> end
>
>
> class Tournament < ActiveRecord::Base
>   has_and_belongs_to_many :contact_methods
> end
>
>
>
> class Registration < ActiveRecord::Base
>   has_and_belongs_to_many :contact_methods
> end
>
>
> *Schema*
>   create_table "contact_methods_registrations", force: :cascade do |t|
>     t.integer "contact_method_id"
>     t.integer "registration_id"
>     t.string  "value"
>   end
>
>   create_table "contact_methods_tournaments", force: :cascade do |t|
>     t.integer "contact_method_id"
>     t.integer "tournament_id"
>   end
>
> *Form*
>
> <fieldset class="form-group">
>       <legend>Contact Method</legend>
>       <%= hidden_field_tag("registration[contact_methods][]", nil) %>
>       <% @tournament.contact_methods.order(:name).each do |contact| %>
>           <div class="form-check">
>             <label class="form-check-label">
>               <%= check_box_tag("registration[contact_methods][]",
> contact.id, contact.id.in?(@registration.contact_methods.collect(&:id)))
> %>
>              <%= contact.name %>
>             </label>
>           </div>
>           <div>
>             <label>Your <%= contact.name %> Username</label>
>             <%= text_field_tag "registration[contact_methods][]" %>
>           </div>
>
>         <% end %>
>     </fieldset>
>
>
> Thanks.
>
> -Hillary
>
>
> --
> --
> SD Ruby mailing list
> [email protected]
> http://groups.google.com/group/sdruby
> ---
> You received this message because you are subscribed to the Google Groups
> "SD Ruby" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>
> --
> --
> SD Ruby mailing list
> [email protected]
> http://groups.google.com/group/sdruby
> ---
> You received this message because you are subscribed to the Google Groups
> "SD Ruby" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
-- 
SD Ruby mailing list
[email protected]
http://groups.google.com/group/sdruby
--- 
You received this message because you are subscribed to the Google Groups "SD 
Ruby" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to