所以这是我的问题。我一直在与我在项目开始时创建的用户合作一个月。今天我从sqllite切换到sqlserver以满足客户端要求,当我使用我的注册表单创建新用户时,我收到以下错误:
can't convert Symbol into Integer
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"51nF50CYGNqz3N4o7TUYSyWeTadulXojQBPqERjvlcY=",
"user"=>{
"email"=>"test@blizzardlabs.com",
"login"=>"bgarrison",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"profile_attributes"=>{
"prefix"=>"",
"first_name"=>"Bill",
"last_name"=>"Garrison",
"suffix"=>"",
"birthday"=>"1983-06-01",
"phone_numbers_attributes"=>{
"0"=>{
"info"=>"1234567890",
"label"=>"Cell"
}
}
}
},
"commit"=>"Register"}
我有一种感觉,在某些时候我搞砸了注册过程,但我不能为我的生活弄清楚在哪里。用户> has_one profile-> has_many phone_numbers。
用户控制器:
def create
@user = User.new(params[:user])
if @user.save
@profile = @user.profile
flash[:notice] = "Your account has been created."
redirect_to(@user)
else
flash[:notice] = "There was a problem creating you."
render :action => :new, :layout => 'logged_out'
end
end
用户模型:
class User < ActiveRecord::Base
# Accessible attributes
attr_accessible :login,
:email,
:password,
:password_confirmation,
:profile_attributes,
:active
# Associations
has_one :profile, dependent: :destroy, autosave: true
# Allows for a profile hash in user creation (stored in :profile_attributes)
accepts_nested_attributes_for :profile
个人资料模型:
class Profile < ActiveRecord::Base
# Accessible Attributes
attr_accessible :birthday,
:company_id,
:first_name,
:last_name,
:prefix,
:suffix,
:phone_numbers_attributes,
:addresses_attributes
# Model Associations
has_many :phone_numbers, :as => :contactable, :class_name => "PhoneNumber", autosave: true
accepts_nested_attributes_for :phone_numbers, allow_destroy: true, reject_if: :all_blan
任何帮助将不胜感激。谢谢!
更新:1此外,我已经测试了一些,并意识到如果我省略了电话号码然后它可以工作.....如果我然后使用相同的表格更新并添加电话号码一切正常。
答案 0 :(得分:1)
嵌套属性应该作为Array传递:
"user"=>{
"email"=>"test@blizzardlabs.com",
"login"=>"bgarrison",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"profile_attributes"=>[
{
"prefix"=>"",
"first_name"=>"Bill",
"last_name"=>"Garrison",
"suffix"=>"",
"birthday"=>"1983-06-01",
"phone_numbers_attributes"=>{
"0"=>{
"info"=>"1234567890",
"label"=>"Cell"
}
}
}
]
}
答案 1 :(得分:0)
所以,经过几天把头撞到墙上,我终于弄明白了。但要了解它,我需要更好地解释我的模型。
基本上,从上面你可以看到用户有一个配置文件,其中有许多phone_numbers和地址通过多态关联(:as =&gt;:contactable)。但是,contactable实际上是一个名为ContactInformation的基类,它使用STI来包含所有类型的可联系信息。
有一次,我决定为地址增加4个字段会使STI关系变得混乱,但我仍然希望保留它。我的解决方案是将所有这些字段序列化到ContactInformation的“info”字段中。现在,电话号码只有“数字”作为一个序列化并存储到“信息”的字段,但如果我想将其分成“区号”“扩展”等,则实现将很简单。
这导致了问题。在我的注册表单上,我使用标签/信息作为我的phone_number字段而不是标签/号码。我编辑了我的编辑表单,但不是我的新表单(是的,我知道它们应该是同一个,但我有一个特殊的ajax表单进行编辑)。
以下是ContactInformation / PhoneNumber / Address
的代码class ContactInformation < ActiveRecord::Base
attr_accessible :contactable_id, :contactable_type, :info, :label, :type
belongs_to :contactable, :polymorphic => true
end
class PhoneNumber < ContactInformation
attr_accessible :number
stash :number, in: :info
#----------------------------------Validations--Start-------------------------
validates :number, presence: true
#----------------------------------Validations--End---------------------------
end
class Address < ContactInformation
attr_accessible :street_address, :city, :state, :postal
stash :street_address, :city, :state, :postal, in: :info
#----------------------------------Validations--Start-------------------------
validates :street_address, :city, :state, :postal, presence: true
#----------------------------------Validations--End---------------------------
end