Seth
Joined
Activity
Hey Red, I am running into a new challenge that I thought you would understand well. Picking up the discussion above, now I would like to update my form action to create a new contact (if a contact doesn't exist ... as defined by the email field) or find and update that contact with the provided form details. Through some research, I discovered:
autosave_associated_records_for_
In my join model I now have:
def autosave_associated_records_for_lead
if new_lead = Lead.find_by_email(lead.email)
self.lead = new_lead
else
new_lead.save!
end
end
The problem I'm running into is that this doesn't update the contact, if the contact exists. Any chance you could help me solve that last problem?
I am setting up telephone validation for a Lead model. Leads have a field called :phone. I'm using phonelib to validate the contents of that field. My New Lead form is nested within a second model, therefore the second model accepts_nested_attributes_for :leads. Without phonelib, my leads are saved just fine. With phonelib, I'm getting the following error in my :create action:
wrong number of arguments (given 3, expected 1..2)
Strong params are all set, and the model validations are set. Not sure what's hanging this up. Any ideas?
Thanks Red, I finally found my problem and solved it! You are right, all the inverse_of stuff was unnecessary (I removed). Everything boiled down to my f.fields_for :contact line. I changed that to:
<%= f.fields_for :contact, Contact.new do |c| %>
...and voila, everything worked! I feel like the Contact instantiation should be in the controller though.. it's just that I can't seem to get the Contact instantiated from the :new action with everything I tried. 🤷🏼♂️
Thanks Red, I've added the ID back in (mistakenly pulled it out as I was experimenting). I'll definitely reconsider my :signin model name as well. I am now running into an errors that says: Could not find the inverse association for contact (:signin in Contact). I'm wondering if this comes back to an incorrect Inverse_of declaration (Thoughtbot wrote on it here: https://thoughtbot.com/blog/accepts-nested-attributes-for-with-has-many-through). But I just can't seem to get it working.
I'm building my first semi "real world" rails app (an Open House management app for real estate). I am currently stuck on a "accepts nested attributes" problem. Here are the details... (I've provided all code below)
An open house can have many contacts (attendees), and a contact can attend many open houses. So, I have a join model called Signin. When someone "signs in" to an open house via the Open House > Sign In form, I would like a "sign in" instance to be created along with a contact via nested attributes. Note: Since this is a "has many through", the "Sign in" and "contact" models are not the traditional "parent/child" relationship.
When attempting to submit my Signin form, the form error says "Contact must exist" and the log reports "Unpermitted parameter: :contacts". (I do have strong parameter sit, but perhaps incorrectly).
At this point, I just feel like I've tried everything, but I can't get the form to create a Contact as well as a Signin instance.
The relevant models:
class OpenHouse < ApplicationRecord
belongs_to :listing
has_many :signins, inverse_of: :open_house
has_many :contacts, through: :signins
class Signin < ApplicationRecord
belongs_to :open_house
belongs_to :contact
accepts_nested_attributes_for :contact
class Contact < ApplicationRecord
has_many :signins
has_many :open_houses, through: :signins
Routes: (Signins are nested within each open house to allow easy sharing of sign in form)
resources :open_houses do
resources :signins
end
resources :contacts
The Signin Controller:
class SigninsController < ApplicationController
def new
@open_house = OpenHouse.find(params[:open_house_id])
@signin = @open_house.signins.build
end
def create
@open_house = OpenHouse.find(params[:open_house_id])
@signin = @open_house.signins.new(signin_params)
if @signin.save
redirect_to @signin, notice: 'You are now signed in'
else
render :new
end
end
def show
@signin = Signin.find(params[:id])
end
private
def signin_params
params.require(:signin).permit( contacts_attributes: [:name, :email, :phone])
end
end
Signin Form:
<%= form_with model: [ @open_house, @open_house.signins.build ], local: true do |f| %>
<% if @signin.errors.any? %>
- <%= msg %>
<% @signin.errors.full_messages.each do |msg| %>
<% end %>
<% end %>
<%= f.fields_for :contacts do |c| %>
<%= c.label :name %>
<%= c.text_field :name, placeholder: "Your name", class: "form-control" %>
<%= c.label :email %>
<%= c.text_field :email, placeholder: "Your email", class: "form-control" %>
<%= c.label :phone %>
<%= c.text_field :phone, placeholder: "Your phone", class: "form-control" %>
<% end %>
<%= f.submit 'Sign In', class: "btn btn-primary" %>
<% end %>