On Saturday, January 20, 2018 at 3:54:27 AM UTC, kenatsun wrote:
> Using scaffold, I generated two models, Person and Offer, and the forms to 
> manage them.  Offer has a belong_to association with Person.  After running 
> the generator, all the forms immediately worked fine.  
> 
> But then I discovered an external requirement that the foreign key column in 
> the offers table, which was named person_id per Rails conventions, needed to 
> be renamed as worker_id.  Since then, the Offer forms don't work.  They evoke 
> a variety of errors, all related to the renamed column.  It seems that the 
> system no longer recognizes it as implementing the Offer to Person 
> association.
> 

You need to tell the has_many/belongs_to associations to use the new key, ie

(In Offer)

belongs_to :person, foreign_key: “worker_id”

And similarly for the has_many in the Person class.  The form helpers need to 
be using the worker_id , since person_id doesn’t exist anymore. 

Fred







> I figure I need to make some declaration somewhere to restore this 
> associative functionality, but I can't figure out how to do this.  Can you 
> help?
> 
> Here are some details:
> 
> The generate commands I used were:
> 
> 
> rails generate scaffold Person name:string
> rails generate scaffold Offer terms:string person:belongs_to
> rake db:migrate
> 
> I tweaked the Offer forms a bit to show People's names in display pages and 
> provide a drop-down on edit forms.  The tweaked Offer index.html.erb looked 
> like this:
> 
> 
> 
> ...
>    <% @offers.each do |offer| %>
>       <tr>
>         <td><%= offer.terms %></td>
>         <td><%= offer.person.name %></td>
>         <td><%= link_to 'Show', offer %></td>
>         <td><%= link_to 'Edit', edit_offer_path(offer) %></td>
>         <td><%= link_to 'Destroy', offer, method: :delete, data: { confirm: 
> 'Are you sure?' } %></td>
>       </tr>
>     <% end %>
> ...and the tweaked Offer _form.html.erb looked like this:
> 
> 
> <%= form_with(model: offer, local: true) do |form| %>
> ...
>   <div class="field">
>     <%= form.label :terms %>
>     <%= form.text_field :terms, id: :offer_terms %>
>   </div>
> 
>   <div class="field">
>     <%= form.label :person_id %>
>     <%= form.collection_select :person_id, Person.order(:name), :id, :name %>
>   </div>
> ...
> 
> At this point, everything worked fine.  
> 
> Then I wrote and executed this migration:
> 
> 
> class RenameOfferPersonId < ActiveRecord::Migration[5.1]
>   def change
>       rename_column :offers :person_id :worker_id
>   end
> end
> Since then, all of my Offer forms get errors, always related to the renamed 
> foreign key column.  Here's the error for  index.html.erb:
> 
> 
> 
> 
>     Showing /home/ec2-user/environment/ww1/app/views/offers/index.html.erb 
> where line #18 raised:
>   
>   undefined method `name' for nil:NilClass
> ...
>         <td><%= offer.person.name %></td>
> 
> If I change the offending line to:
> 
> 
>         <td><%= offer.worker_id %></td>
> the page displays, but only the value of worker_id is displayed, not the name 
> of the referenced Person.
> 
> The Offer edit form displays, including its dropdown box containing Person 
> names.  But when I try to save an update, I get:
> 
> 
> ActiveModel::UnknownAttributeError in OffersController#update 
> unknown attribute 'person_id' for Offer.
> 
> 
>         Extracted source (around line #44):
> 
> ...      
>       
>         
>           
>             
> 44    if @offer.update(offer_params) 
> 
> If I change these lines in _form.html.erb
> 
> 
>     <%= form.label :person_id %>
>     <%= form.collection_select :person_id, Person.order(:name), :id, :name %>
> to
> 
> 
>     <%= form.label :worker_id %>
>     <%= form.collection_select :worker_id, Person.order(:name), :id, :name %>
> the form still displays OK, but when I try to save an update, I get a 
> different error:
> 
> 
> 
> 1 error prohibited this offer from being saved:Person must exist
> 
> ~ Thanks in advance for your help
> ~ Ken

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/861f71bc-0dde-4a36-95d8-75e2bce3bea3%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to