2017-02-02 138 views
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 

我想签入新的行动创造双方签入和相关租赁:

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

我添加租赁属性与CheckInsController强PARAMS:

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

您是否在strong_params –

+0

中添加了'tenancy_attributes'我添加了原始问题,谢谢 –

+0

啊,我刚刚意识到我没有:允许的params中的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 helperrails guides - form helpers)当您构建表单时,还需要一个Property引用。

我试着更好地解释我用一个例子:

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

我的天堂没有试过这段代码,但我希望这至少给你一种方法来解决你的问题。