2016-06-06 13 views
1

Ich habe ein recipient und category Modell. Es ist eine einfache Zuordnung von 1 Kategorie hat viele Empfänger. Wenn ich versuche, das recipient Formular zu aktualisieren und einen category zuzuweisen, wird es nicht in dem Datensatz speichern. Wenn ich die Konsole verwende und einen Datensatz manuell aktualisiere, z. Recipient.update(9, category_id: 13), ich sehe die korrekte Kategorie, die dem Empfänger zugewiesen wurde, aber wenn ich versuche, den Datensatz zu bearbeiten/zu aktualisieren, wird er nicht in der neuen gewählten Kategorie gespeichert.simple_form association speichert nicht gehört_zu_id

Hier mein recipient Modell ist

class Recipient < ActiveRecord::Base 
    belongs_to :category 

    accepts_nested_attributes_for :category 
end 

Hier ist mein category Modell

class Category < ActiveRecord::Base 
    has_many :recipients 
    validates :category, presence: true 

    default_scope { order('category')} 
end 

hier ist die recipient Controller

class RecipientsController < ApplicationController 
    def index 
    @recipients = Recipient.order(:recipient_name).page(params[:page]) 
    end 

    def new 
    @recipient = Recipient.new 
    end 

    def show 
    @recipient = Recipient.find(params[:id]) 
    end 

    def create 
    @recipient = Recipient.new(recipient_params) 
    if @recipient.save 
     redirect_to recipients_path 
    else 
     render :new 
    end 
    end 

    def edit 
    @recipient = Recipient.find(params[:id]) 
    end 

    def update 
    @recipient = Recipient.find(params[:id]) 

    recipient_params = params.require(:recipient).permit(:recipient_name, :alternate_name, :description, :city, :state, :country, category_attributes: [:category, :id]) 
    @recipient.update_attributes(recipient_params) 

    redirect_to recipient_path(id: @recipient.id) 
    end 

    def destroy 
    @recipient = Recipient.find(params[:id]) 
    @recipient.destroy 

    redirect_to recipients_path 
    end 

    private 
    def recipient_params 
    params.require(:recipient).permit(:recipient_name, :alternate_name, :description, :city, :state, :country, product_attributes: [:product_name, recipient_products: [:recipient_id, :product_id]], channel_attributes: [:channel_name, recipient_channels: [:recipient_id, :channel_id]], category_attributes: [:id, :category]) 
    end 

end 

hier ist die edit Ansicht

<div class="row"> 
    <div class="col-sm-6"> 
    <h2>Edit <%= @recipient.recipient_name %></h2> 

    <%= simple_form_for @recipient do |form| %> 
     <%= form.error_notification %> 
     <%= form.input :recipient_name, placeholder: 'Recipient', label: 'Recipient Name' %> 
     <%= form.input :alternate_name, placeholder: 'Alternate Name' %> 
     <%= form.association :category, label_method: :category, value_method: :id %> 
     <%= form.input :description, placeholder: 'Description'%> 
     <%= form.input :city, placeholder: 'City'%> 
     <%= form.input :state, placeholder: 'State' %> 
     <%= form.input :country, as: :country, priority: ['US', 'CA'] %> 
     <%= form.button :submit, 'Update Recipient', {:class=>"btn btn-secondary"} %> 
     <%= link_to "Cancel", :back, {:class=>"btn btn-default"} %> 
    <% end %> 
    </div> 
</div> 

und hier ist meine routes.rb Datei

Rails.application.routes.draw do 
    root to: 'home#index' 
    resources :media_points 
    resources :products 
    resources :channels 
    resources :recipients 
    resources :media_point_products 
    resources :distributions 
    resources :categories do 
    resources :recipients 
    end 
    get '/listing' => "listing#index" 
    devise_for :admins 
    devise_for :users 
    resources :users 
end 
+0

Ich glaube, Sie müssen die Params-Methode in Ihrem Controller ändern. Versuchen Sie Folgendes zu ändern: category_attributes: [: category,: id] to category_id:: category_id_from_form_here – bkunzi01

Antwort

0

ich es als Antwort, da das Format schrieb ein Schmerz in den Kommentaren ist:

Ihre recipient_params private Methode von Wechsel: category_attributes: [:category, :id]

bis

category_id: param_that_has_category_id_here 

Sie haben auch zwei Routen für Empfänger und es wird die erste passende Route verwenden, die nicht die verschachtelten Empfänger in Kategorien Route ist, die Sie weiter unten haben. Wenn die erste Änderung in Ihrer privaten Methode nicht das Problem beheben würde ich die verschachtelte Situation angeben in Simple tun, wie da folgt man wahrscheinlich sucht die verschachtelte Route zu verwenden:

simple_form_for [@category, @recipient], url: 'nested_route_path_here' do |f| 

Fügen Sie einfach @category = Category.new zu Ihrer neuen Aktion in der Empfänger-Controller und dann in Ihrer erstellen Aktion haben Sie die Kategorie param über params gesendet [: category_id]

+0

Ich verstehe die meisten Ihrer Antwort, aber verirrt sich auf die richtige Syntax für 'category_id: param_that_has_category_id_here' Ich bin mir nicht sicher, was für' param_that_has_category_id_here' – awkale

+0

Ihr Formular übermittelt einen Wert für die Kategorie-ID. Das Attribut, das Sie in Ihrem Formular für diesen Wert angegeben haben, sollte in Ihrer params-Methode auf die Whitelist gesetzt und "category_id" zugewiesen werden, damit Rails die Zuordnung ordnungsgemäß verarbeitet. – bkunzi01