0

Я не могу получить свою запись CheckIn для сохранения, поскольку связанная с ней аренда не сохраняется.Rails/ActiveRecord - ассоциация, не сохраняющая

У меня есть три модели с ассоциациями:

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 

Я хочу фиксирование нового действия для создания как фиксирования и связанного с ним Tenancy:

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

Я должен включать PROPERTY_ID часть иначе Аренда не спасет.

Форма в 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 %> 

Я добавил аренды атрибутов сильного Params в CheckInsController:

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

Стоит отметить, что в check_ins маршруты являются вложенными в свойствах:

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

Так что проблема в том, что к тому времени, когда я получу для создания действия в CheckInsController, аренда, которую я построил, исчезла. Я не уверен, как и когда каждая из записей должна быть сохранена, а небольшая сложность того, что я пытаюсь достичь, затрудняет поиск соответствующей помощи, поэтому любые идеи?

Я использую Rails 5.

+0

Вы добавили 'tenancy_attributes' в strong_params –

+0

У меня есть, я добавил, что в исходный вопрос, спасибо –

+0

А, я просто понял, что у меня нет: tenancy_id в разрешенных параметрах .. но тогда я положил он в и он по-прежнему не спасает –

ответ

0

Проблема заключалась в том, что имущество прилагается к сдаче в аренду был забывается. Я удалил вложение свойства из нового действия:

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

Добавлено скрытое поле для PROPERTY_ID в форме (а также добавление: PROPERTY_ID к сильным Params):

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

И спас договор аренды в CheckIn создать действие, перед сохранением чек сам по себе:

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 

Я бы, конечно, будет интересно, если кто-то может выискивать в этом растворе или предложить лучше.

0

Использование вложенных ресурсов (check_ins зависит от свойств) вы создаете маршруты пространств имен. form_for helper (rails guides - form helpers) Когда вы строите свою форму, вам нужна ссылка на недвижимость.

Я пытаюсь объяснить мне лучше с примером:

# 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 %> 

Я убежище 't пробовал этот код, но я надеюсь, что это даст вам по крайней мере способ следовать, чтобы решить вашу проблему.