Ruby on rails 活动记录接受嵌套属性-创建具有重写类名称的记录
当我保存表单(这里显示的最后一段代码)时,我会收到一个错误消息:unknown attribute:person 我认为这是因为我重写了administrator属性的类名 有什么想法吗Ruby on rails 活动记录接受嵌套属性-创建具有重写类名称的记录,ruby-on-rails,activerecord,nested-attributes,Ruby On Rails,Activerecord,Nested Attributes,当我保存表单(这里显示的最后一段代码)时,我会收到一个错误消息:unknown attribute:person 我认为这是因为我重写了administrator属性的类名 有什么想法吗 class Event < ActiveRecord::Base #start_date, end_date, title has_one :administrator, :class_name => "Person" has_one :account_manager, :class_
class Event < ActiveRecord::Base
#start_date, end_date, title
has_one :administrator, :class_name => "Person"
has_one :account_manager, :class_name => "Person"
accepts_nested_attributes_for :administrator
end
class Person < ActiveRecord::Base
#fname, lname, bday
belongs_to :event
end
事件控制器#创建
看法
我还注意到,该字段的名称为event[person][lname],这将是一个问题,因为event需要接受account\u manager的嵌套属性
<%= form_for @event do |f| %>
<%= f.text_field.title %>
<%= f.fields_for @event.administrator, :administrator_attributes do |administrator| %>
<%= administrator.text_field :lname %>
<% end %>
<%= f.submit "Save" %>
<% end %>
不太合适的方式,但效果良好:
class EventsController < ApplicationController
before_filter :fix_administrator_attribs, :only => [:create, :update]
# ...
protected
def fix_administrator_attribs
if params[:event][administrator]
administrator = params[:event][:administrator]
params[:event].delete(:administrator)
params[:event].update({:administrator_attributes => administrator})
end
end
end
类事件控制器[:create,:update]
# ...
受保护的
def修复\u管理员\u属性
如果参数[:事件][管理员]
管理员=参数[:事件][:管理员]
参数[:事件]。删除(:管理员)
参数[:event].update({:administrator\u attributes=>administrator})
结束
结束
结束
我的参数散列中没有管理员。它在表单上显示为事件[个人][名称]啊!你第一次是对的。但是,符号应该出现在字段u中的对象之前。这种方式似乎对我不起作用。字段:administrator、@event.administrator do。。。。或字段\u:管理员执行。。他们都很出色,你帮我找到了解决办法。添加对我有效的部分,我将标记它。谢谢你的帮助!!没问题。在我的回答中包含了旧的解决方案。
<%= form_for @event do |f| %>
<%= f.text_field.title %>
<%= f.fields_for :administrator do |administrator| %>
<%= administrator.text_field :lname %>
<% end %>
<%= f.submit "Save" %>
<% end %>
<%= form_for @event do |f| %>
<%= f.text_field.title %>
<%= f.fields_for @event.administrator, :administrator_attributes do |administrator| %>
<%= administrator.text_field :lname %>
<% end %>
<%= f.submit "Save" %>
<% end %>
class EventsController < ApplicationController
before_filter :fix_administrator_attribs, :only => [:create, :update]
# ...
protected
def fix_administrator_attribs
if params[:event][administrator]
administrator = params[:event][:administrator]
params[:event].delete(:administrator)
params[:event].update({:administrator_attributes => administrator})
end
end
end