As an update to this, if I remove the         @address = 
@business.create_address(params[:address]) from create and update only one 
record is created.   However, it is being created with an addressable_id of 
NIL even though I see it inserting with the right addressable_id in the 
log.   I figured maybe I'm doing something wrong as this is a nested group 
so I made the same code in a simple model and it "works" I think.   
Meaning, I can create and edit an address and it shows on my form if in the 
edit I change it to, in the case of my simple test:

@address = @article.address ||= @article.create_address(params[:address])

But when I update that address, it creates another address instead of 
updating the existing one, leaving the existing one as an addressable_id of 
NIL in the database.

I think I must be closing in on this one :).

On Wednesday, May 15, 2013 7:05:48 AM UTC-5, Art Mills wrote:
>
> I have this question up at Stack Overflow and am hoping I am just not 
> quite right.   I've gotten polymorphic associations working in Rails 3.2.X 
> but for some reason in 4.0 I'm just missing something.   Currently the code 
> I'll attach does most everything right.   But it fails to capture the 
> addressable_id even though in the log I see that ID is correct and it looks 
> like it is being committed.   My guess is I have something wrong with how 
> I'm doing the view, or something slightly wrong in the business controller. 
>   I'm hoping someone can jar me toward the solution.   This is a simple 
> address model that will be used in a number of other models.   
>
> Any help is appreciated.   The problem pasted below states I get "two" 
> addresses, one blank, and one that has the params, but not addressable_id. 
>   If I remove from create and update the  @address = 
> @business.create_address(params[:address]) I only get one, so it seems 
> having both invokes the build to save and the create to be saved with one 
> being totally nil and the other not having an addressable type.   
>
> THIRD UPDATE: Ok, now I am very close, I think.   I now am creating data 
> and the parameters are being set in the DB.  I changed the business 
> controller strong params to be:
>
>     def business_params
>           params.require(:business).permit(:name, :description, 
> :address_attributes=>[:line1, :line2, :city, :state, :zip])
>
> When I edit an existing business I get TWO addresses created for some 
> reason.   One is empty and one is complete with the parameters.   So, I 
> think I'm very close if anyone has the final push :). 
>
> Address model
>
>     class Address < ActiveRecord::Base
> belongs_to :addressable, polymorphic: true
>     end
>
> Business model:
>
>         class Business < ActiveRecord::Base
>         
>          #each business belongs to user, through user_id
>           belongs_to :owner
>           has_one :address, as: :addressable
>           accepts_nested_attributes_for :address
>     
>           # each business has many customers and has many services
>           has_many :customers
>           has_many :services
>     
>         validates :owner_id, presence:true
>         validates_presence_of :name
>         #validates_length_of :state, is: 2
>     
>     end
>
> business controller:
>
>      class BusinessesController < ApplicationController
>       before_action :get_owner
>       before_action :set_business, only: [:show, :edit, :update, :destroy]
>       #helper_method :sort_column, :sort_direction
>     
>     
>       def index
>         @businesses = @owner.businesses
>       end
>     
>       def show
>         #@customer = @business.customers.order(sort_column + " " + 
> sort_direction)
>       end
>     
>       def new
>         @owner = Owner.find(params[:owner_id])
>         @business = @owner.businesses.build
>         @address = @business.build_address(params[:address])
>     
>       end
>     
>       def edit
>         @address = @business.build_address(params[:address])
>       end
>     
>       def create
>         @business = @owner.businesses.new(business_params)
>         @address = @business.create_address(params[:address])
>     
>         respond_to do |format|
>           if @business.save
>             format.html { redirect_to owner_businesses_url(@owner), 
> notice: 'Business was successfully created.' }
>             format.json { render action: 'show', status: :created, 
> location: @business }
>           else
>             format.html { render action: 'new' }
>             format.json { render json: @business.errors, status: 
> :unprocessable_entity }
>           end
>         end
>       end
>     
>       def update
>         @address = @business.create_address(params[:address])
>         respond_to do |format|
>           if @business.update(business_params)
>             format.html { redirect_to owner_businesses_url(@owner), 
> notice: 'Business was successfully updated.' }
>             format.json { head :no_content }
>           else
>             format.html { render action: 'edit' }
>             format.json { render json: @business.errors, status: 
> :unprocessable_entity }
>           end
>         end
>       end
>     
>       def destroy
>         @business.destroy
>         respond_to do |format|
>           format.html { redirect_to owner_businesses_url(@owner) }
>           format.json { head :no_content }
>         end
>       end
>     
>       private
>         # Use callbacks to share common setup or constraints between 
> actions.
>         def set_business
>           @business = @owner.businesses.find(params[:id])
>         end
>     
>         # Never trust parameters from the scary internet, only allow the 
> white list through.
>         def business_params
>           params.require(:business).permit(:name, :description, 
> :address_attributes=>[:line1, :line2, :city, :state, :zip])
>         end
>     
>         def get_owner
>           @owner = Owner.find(params[:owner_id])
>         end
>     
>         #def sort_column
>         #  Customer.column_names.include?(params[:sort]) ? params[:sort] : 
> "first_name"    
>         #end
>     
>         #def sort_direction
>         #  %w[asc desc].include?(params[:direction]) ? params[:direction] 
> : "asc"
>         #end
>       end
>
> form view:
>
>
>             <%= form_for([@owner, @business]) do |f| %>
>           <% if @business.errors.any? %>
>             <div id="error_explanation">
>               <h2><%= pluralize(@business.errors.count, "error") %> 
> prohibited this business from being saved:</h2>
>     
>           <ul>
>           <% @business.errors.full_messages.each do |msg| %>
>             <li><%= msg %></li>
>           <% end %>
>           </ul>
>         </div>
>       <% end %>
>     
>       <div class="field">
>         <%= f.label :name %><br />
>         <%= f.text_field :name %>
>       </div>
>       <div class="field">
>         <%= f.label :description %><br />
>         <%= f.text_area :description %>
>       </div>
>     
>       <%= f.fields_for :address do |address| %>
>       <%= p address.object %>
>       <div class="field">
>         <%= address.label :line1 %><br>
>         <%= address.text_field :line1 %>
>       </div>
>       <div class="field">
>         <%= address.label :line2 %><br>
>         <%= address.text_field :line2 %>
>       </div>
>       <div class="field">
>         <%= address.label :city %><br>
>         <%= address.text_field :city %>
>       </div>
>       <div class="field">
>         <%= address.label :state %><br>
>         <%= address.text_field :state %>
>       </div>
>       <div class="field">
>         <%= address.label :zip %><br>
>         <%= address.number_field :zip %>
>       </div>
>      
>       <% end %>
>     
>       <div class="actions">
>         <%= f.submit %>
>       </div>
>     <% end %>
>
> Now I'm getting two addresses created.   One empty, one with the 
> parameters set.   Almost there :).
>

-- 
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/ac4329ff-d69d-46eb-9588-714e3e1baadf%40googlegroups.com?hl=en-US.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to