2016-06-20 2 views
1

J'ai configuré une ressource polymorphe en utilisant accept_nested_attributes_for mais pour une raison quelconque, lorsque j'essaie de mettre à jour, au lieu de simplement mettre à jour l'enregistrement en cours, j'en crée un nouveau. Est-ce que quelqu'un peut me dire quel est le problème? Merci.Rails 4, mise à jour de ressource polymorphe imbriquée

vendors_controller.rb

class VendorsController < ApplicationController 
    before_action :authenticate_user! #check if user logged in 
    before_action :set_vendor, only: [:show, :edit, :update, :destroy] 

    def index 
    @vendors = current_company.vendors 
    end 

    def new 
    @vendor = current_company.vendors.build 
    @vendor.addresses.build 
    end 

    def create 
    @vendor = current_company.vendors.build(vendor_params) 
    if @vendor.save 
     flash[:notice] = 'New Vendor Added' 
     redirect_to vendors_url 
    else 
     flash[:error] = 'Could not save vendor information. Please try again.' 
     render 'new' 
    end 
    end 

    def show 
    end 

    def edit 
    #@vendor = Vendor.find(params[:id]) 
    #@vendor.addresses.find_or_initialize_by(addressable_id: @vendor.id, addressable_type: 'Vendor') 
    end 

    def update 
    #@vendor = Vendor.find(params[:id]) 
    if @vendor.update(vendor_params) 
     flash[:notice] = 'Vendor Updated' 
     redirect_to vendors_path 
    else 
     flash[:error] = 'Could not save vendor information. Please try again.' 
     render 'edit' 
    end 
    end 

    def destroy 
    #Vendor.find(params[:id]).destroy 
    @vendor.destroy 
    flash[:notice] = "Asset deleted" 
    redirect_to vendors_url 
    end 

    private 

    def vendor_params 
params.require(:vendor).permit(:name, :vendorID, :contact, :email, :phone, :image, :remove_image, addresses_attributes: [:street_1, :street_2, :city, :state, :zip]) 
    end 

    def set_vendor 
    @vendor = Vendor.find(params[:id]) 
    end 

    def current_company 
    current_user.company 
    end 
end 

_form.html.erb

<div class="row"> 
    <div class="col-md-4 col-md-offset-4"> 
    <div class="card card-block" style="background-color:#f5f5f5"> 

    <%= form_for @vendor do |f| %> 

     <div class="form-group"> 
     <%= f.label :name, 'Vendor Name' %><br /> 
     <%= f.text_field :name, autofocus: true, required: true, class:'form-control' %> 
     </div> 

     <div class="form-group"> 
     <%= f.label :vendorID, 'Vendor ID/Number' %><br /> 
     <%= f.text_field :vendorID, class:'form-control' %> 
     </div> 

     <div class="form-group"> 
     <%= f.label :contact, 'Main Contact Person' %><br /> 
     <%= f.text_field :contact, class:'form-control' %> 
     </div> 

     <div class="form-group"> 
     <%= f.label :email %><br /> 
     <%= f.email_field :email, class:'form-control' %> 
     </div> 

     <div class="form-group"> 
     <%= f.label :phone %><br /> 
     <%= f.phone_field :phone, class:'form-control' %> 
     </div> 

     <%= f.fields_for :addresses do |a| %> 
      <div class="form-group"> 
      <%= a.label :street_1, 'Street' %><br /> 
      <%= a.text_field :street_1, class:'form-control' %> 
      </div> 

      <div class="form-group"> 
      <%= a.label :street_2, 'Street 2 (Optional)' %><br /> 
      <%= a.text_field :street_2, class:'form-control' %> 
      </div> 

      <div class="form-group"> 
      <%= a.label :city, 'City' %><br /> 
      <%= a.text_field :city, class:'form-control' %> 
      </div> 

      <div class="form-group"> 
      <%= a.label :state, 'State' %><br /> 
      <%= a.text_field :state, class:'form-control' %> 
      </div> 

      <div class="form-group"> 
      <%= a.label :zip, 'Zip Code' %><br /> 
      <%= a.text_field :zip, class:'form-control' %> 
      </div> 
     <% end %> 

     <div class="actions form-group"><br> 
     <%= f.submit 'Save Vendor', class: 'btn btn-primary' %> 
     <%= link_to 'Cancel', :back, class: 'btn btn-default' %> 
     </div> 

    <% end %> 
</div> 

vendor.rb

class Vendor < ActiveRecord::Base 
    belongs_to :company 
    has_many :asset 

    has_many :addresses, as: :addressable, dependent: :destroy 
    accepts_nested_attributes_for :addresses, reject_if: RejectDeeplyNested.blank? 
end 

address.rb

class Address < ActiveRecord::Base 
    belongs_to :addressable, polymorphic: true 
end 

Répondre

0

vous devez changer vos paramètres autorisés comme celui-ci

params.require(:vendor).permit(:name, :vendorID, :contact, :email, :phone, :image, :remove_image, addresses_attributes: [:street_1, :street_2, :city, :state, :zip, :id]) 
+0

Merci, je ne peux pas croire que je me suis fait trébucher par quelque chose d'aussi simple que de manquer un identifiant. – Kr0n0s

+0

Bienvenue heureux de vous aider à vous s'il vous plaît votez également :-) –

-1

Vous devez ajouter optional: true à votre relation:

class Address < ApplicationRecord 
    belongs_to :addressable, polymorphic: true, optional: true 
end 

oublié de mentionner que optional est disponible uniquement sur les rails > 5

+0

Vous avez une erreur quand j'ai ajouté la clé en option 'Clé inconnue:: facultatif. Les clés valides sont:: class_name,: anonymous_class,: foreign_key,: validate,: autosave,: dépendante,: primary_key,: reverse_of,: obligatoire,: foreign_type,: polymorphic,: touch,: counter_cache' – Kr0n0s

+0

@ Kr0n0s S'il vous plaît vérifier ma mise à jour –