尝试了几个小时后,我无法保存到数据库。
上下文是这样的:我有两种类型的用户,一种我只需要非常基本的信息[用户名,电子邮件,密码],另一种我需要很多信息[年龄,性别,城市等]
我没有使用 STI,因为表中会有大量的 Null 值。因此,我创建了这三种模式,其中用户是否有个人资料(个人资料表)取决于其类型 [1 或 2],并且此个人资料的一个字段是该用户居住的城市,与另一个表格相关DB,城市表
class User < ActiveRecord::Base
has_one :profile
has_one :city, through: :profile
end
class Profile < ActiveRecord::Base
belongs_to :user
belongs_to :city
[...a bunch of fields here]
end
class City < ActiveRecord::Base
has_many :profiles
has_many :users, through: :profiles
end
当我在 Rails 控制台中与它们一起玩时,一切正常:
usr = User.new(name: "roxy", email: "roxy@example.me", password: "roxanna", password_confirmation: "roxanna", utype: 1)
cty = City.new(name: "Bucaramanga")
prf = Profile.new (rname: "Rosa Juliana Diaz del Castillo"...)
prf.city = cty
usr.profile = prf
usr.valid?
=> true
usr.save
=> true
但是当我尝试保存在应用程序中时(查看模型)
<%= f.label :city, "En que ciudad te encuentras?"%>
<%= select_tag :city, options_from_collection_for_select(City.all, 'id', "name"),{:prompt => 'Selecciona tu ciudad'}%>
def new
@profile = Profile.new
end
def create
@profile = params[:profile]
@city= City.find_by_id(params[:city].to_i)
@profile.city = @city
end
我收到此错误:
undefined method `city=' for #<ActiveSupport::HashWithIndifferentAccess:0xa556fe0>
有人可以帮帮我吗?
更新 正如大卫建议的那样,我在 create 方法的第一行创建了 Profile 对象,所以我的控制器现在看起来像这样:
def create
@profile = Profile.new(params[:profile])
@city= City.find_by_id(params[:city].to_i)
@profile.city = @city
@usr = current_user
if @usr.profile.exists? @profile
@usr.errors.add(:profile, "is already assigned to this user") # or something to that effect
render :new
else
@usr.profile << @profile
redirect_to root_path
end
end
但我现在收到此错误
undefined method `exists?' for nil:NilClass
current_user 返回@current_user
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
你能告诉我,我做错了什么吗?