Вложенные атрибуты, показывающие 'nil' в базе данных
Застряв на этом некоторое время, я использую gem-мастер и пытаюсь сохранить атрибуты арендаторов во вложенной форме. Атрибуты сохраняются, но выводят ноль в базу данных. Кажется, не могу понять, почему не уверен, что это драгоценный камень, или я упускаю что-то очевидное в модели или контроллере.
параметры
Parameters: {"utf8"=>"✓", "authenticity_token"=>"xPqiDsUpnuLHCSnU+XuAUce4b/cTnM/gv6T7wxdIz4g=", "property"=>{"tenants_attributes"=>{"0"=>{"title"=>"Mr", "firstname"=>"Foo", "surname"=>"bar", "dateofbirth(1i)"=>"2013", "dateofbirth(2i)"=>"7", "dateofbirth(3i)"=>"21", "telno"=>"01143268375", "contact_type"=>"foo", "email"=>"example@gmail.com"}}}, "commit"=>"Create Tenant", "property_id"=>"58"}
вот журнал, показывающий атрибуты арендатора как ноль.
INSERT INTO "tenants" ("contact_type", "created_at", "dateofbirth", "email", "firstname", "property_id", "surname", "telno", "title", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [["contact_type", nil], ["created_at", Sun, 21 Jul 2013 10:53:00 UTC +00:00], ["dateofbirth", nil], ["email", nil], ["firstname", nil], ["property_id", nil], ["surname", nil], ["telno", nil], ["title", nil], ["updated_at", Sun, 21 Jul 2013 10:53:00 UTC +00:00]]
Свойства / Контроллер сборки
class Properties::BuildController < ApplicationController
include Wicked::Wizard
steps :tenant
def show
@property = Property.find(params[:property_id])
@tenant = @property.tenants.new
render_wizard
end
def update
@property = Property.find(params[:property_id])
@tenants = Tenant.find(params[:tenant])
case step
when :tenant
if @tenants.update_attributes(params[:tenants])
render_wizard @tenant
else
render :action => 'edit'
end
end
end
def create
@tenant = Tenant.create
if @tenant.save
flash[:success] = "Tenant Added"
redirect_to wizard_path(steps.first, :tenant_id => @tenant.id)
else
render 'edit'
end
end
конец
модель собственности
class Property < ActiveRecord::Base
attr_accessible :name, :address_attributes, :tenants_attributes
belongs_to :user
has_one :address, :as => :addressable
accepts_nested_attributes_for :address
validates_associated :address
has_many :tenants
accepts_nested_attributes_for :tenants
validates :name, presence: true, length: { maximum: 200 }
validates :address, presence: true
validates :user_id, presence: true
end
Форма арендатора
<h2> Tenant Form</h2>
<%= simple_form_for @property, :url => url_for(:action => 'create', :controller => 'properties/build'), :method => 'post' do |f| %>
<%= f.simple_fields_for :tenants do |f| %>
<%= f.input :title %>
<%= f.input :firstname %>
<%= f.input :surname %>
<%= f.input :dateofbirth %>
<%= f.input :telno %>
<%= f.input :contact_type %>
<%= f.input :email %>
<%= f.submit %>
<% end %>
1 ответ
У вас есть несколько ошибок на ваш взгляд. Во-первых, вам не хватает конечного утверждения. Во-вторых, вы используете f для внешней и внутренней формы, поэтому вы перекрываете внешнее с внутренним. Попробуйте что-то вроде этого:
<%= simple_form_for @property, :url => url_for(:action => 'create', :controller => 'properties/build'), :method => 'post' do |f| %>
# Fields for property (f.input...)
<%= f.simple_fields_for :tenants do |tenant| %>
# Fields For tenant (tenant.input...)
<% end %>
<% end %>
Кроме того, я думаю, что у вас есть ошибка здесь
@tenant = Tenant.create
if @tenant.save
flash[:success] = "Tenant Added"
redirect_to wizard_path(steps.first, :tenant_id => @tenant.id)
else
render 'edit'
end
Когда используешь if something.save
, вы должны использовать something.new
перед этим вместо something.create
(create
создает новую запись и сохраняет ее в базе данных, чтобы не было необходимости ее снова сохранять, и new
просто создает запись, но вы должны сохранить ее вручную).
Вам, вероятно, нужно что-то вроде
@property = Property.new(params[:property])
if @property.save
flash[:success] = "Tenant Added"
redirect_to wizard_path(steps.first, :tenant_id => @tenant.id)
else
render 'edit'
end