0

Ich kann meinen CheckIn-Datensatz nicht speichern, weil die zugehörige Tenancy nicht gespeichert wird.Rails/ActiveRecord - Verknüpfung wird nicht gespeichert

Ich habe drei Modelle mit den Verbänden:

class Property < ApplicationRecord 
    has_many :tenancies 
end 

class Tenancy < ApplicationRecord 
    belongs_to :property 
    has_many :check_ins 
end 

class CheckIn < ApplicationRecord 
    belongs_to :tenancy 
    accepts_nested_attributes_for :tenancy 
end 

ich die CheckIn neue Aktion wollen sowohl die CheckIn und das dazugehörige Tenancy zu erstellen:

def new 
    @check_in = CheckIn.new 
    @check_in.build_tenancy.property_id = params[:property_id] 
end 

ich den property_id Teil umfassen müssen ansonsten die Mieter wird nicht speichern.

Die Form, in check_ins/new.html.erb:

<%= form_for @check_in, url: property_check_ins_path do |f| %> 
    <%= f.label :date_time %> 
    <%= f.datetime_select :date_time, {minute_step: 15} %> 

    <%= f.label :tenancy %> 
    <%= f.fields_for :tenancy do |i| %> 
    <%= i.date_select :start_date %> 
    <% end %> 

    <%= f.submit "Create Check In" %> 
<% end %> 

Ich habe hinzugefügt Mietverhältnis Attribute den starken params in den CheckInsController:

def check_in_params 
    params.require(:check_in).permit(:tenancy_id, :date_time, tenancy_attributes: [:start_date]) 
end 

Es ist erwähnenswert, dass die check_ins Routen sind in Eigenschaften verschachtelt:

resources :properties do 
    resources :check_ins, only: [:new, :create] 
end 

Also das Problem ist, dass bis ich komme Zu der Erstellungsaktion im CheckInsController ist die von mir erstellte Pacht verschwunden. Ich bin mir nicht sicher, wie und wann jede der Aufzeichnungen gespeichert werden sollte und die leichte Komplexität dessen, was ich erreichen möchte, hat es ziemlich schwierig gemacht, relevante Hilfe zu finden, also irgendwelche Ideen?

Ich bin mit Rails 5.

+0

Haben Sie 'tenancy_attributes' in strong_params hinzugefügt –

+0

Ich habe, fügte ich das in der ursprünglichen Frage, danke –

+0

Ah, ich habe gerade festgestellt, dass ich nicht: tenancy_id in den zulässigen params .. aber dann habe ich es in und es spart immer noch nicht –

Antwort

0

Das Problem war, dass das Eigentum an dem Mietverhältnis angebracht vergessen wurde. Ich entfernte die Eigenschaft Befestigung von der neuen Aktion:

def new 
    @check_in = CheckIn.new 
    @check_in.build_tenancy 
end 

Added ein verstecktes Feld für property_id der Form (sowie das Hinzufügen: property_id der starken params):

<%= f.fields_for :tenancy do |i| %> 
    <%= i.date_select :start_date %> 
    <%= i.hidden_field :property_id, value: params[:property_id] %> 
<% end %> 

und rettete das Mietverhältnis in der CheckIn Aktion erstellen, bevor Sie die Check-in selbst speichern:

def create 
    @check_in = CheckIn.new(check_in_params) 
    @check_in.tenancy.save 

    if @check_in.save 
    redirect_to property_check_in_path(@check_in.tenancy.property.id, @check_in) 
    else 
    render :new 
    end 
end 

ich sicherlich interessiert sein würde, wenn jemand Löcher in dieser Lösung wählen könnte oder ein besseres Angebot.

0

Mit geschachtelten Ressourcen (check_ins hängt von den Eigenschaften ab) erstellen Sie eine Namespace-Route. form_for helper (rails guides - form helpers) Wenn Sie Ihr Formular erstellen, benötigen Sie auch eine Property-Referenz.

Ich versuche, mir zu erklären, besser mit einem Beispiel:

# checks_controller.rb

def new 
    @property = Property.new 
    @check_in = @property.build_check_ins 
    @check_in.build_tenancy 
end 

# check_ins/new.html.erb

<%= form_for [@property, @check_in], url: property_check_ins_path do |f| %> 
    <%= f.label :date_time %> 
    <%= f.datetime_select :date_time, {minute_step: 15} %> 

    <%= f.label :tenancy %> 
    <%= f.fields_for :tenancy do |i| %> 
    <%= i.date_select :start_date %> 
    <% end %> 

    <%= f.submit "Create Check In" %> 
<% end %> 

I haven Ich habe diesen Code noch nicht ausprobiert, aber ich hoffe, das gibt dir zumindest einen Weg, dein Problem zu lösen.

Verwandte Themen