我正在使用User模型(使用AuthLogic进行身份验证)和三种模型中的三种用户类型构建系统:其中一种模型是Employer。这三个模型中的每一个都有_many:users,:as => :可认证
首先让网站的新访问者使用用户名,密码,用户类型等创建自己的“用户”记录。
创建后,用户将被发送到三个模型之一的“新”操作。所以,如果他们告诉我们他们是雇主,我们redirect_to:controller => “雇主,:行动=>”新“。
问题:当雇主提交时,我想将current_user.user_type_id设置为雇主ID。这应该很简单......但它不起作用。
# Employers Controller / new
def new
@employer = Employer.new
1.times {@employer.addresses.build}
render :layout => 'forms'
end
# Employers Controller / create
def create
@employer = Employer.new(params[:employer])
if @employer.save
if current_user.blank?
redirect_to :controller => "users", :action => "new"
else
current_user.user_type_id = @employer.id
current_user.user_type = "Employer"
redirect_to :action => "home", :id => current_user.user_type_id
end
else
render :action => "new"
end
end
------ ------ UPDATE
你好。作为回应:我正在使用这个表结构,因为我的三个用户类型模型中的每一个都有很多不同的字段,每个字段与其他模型有不同的关系,这就是我避免使用STI的原因。
通过1次(@ employer.addresses.build)我将雇主模型以一种形式连接到地址多态表,所以我要求控制器建立一个新地址与新雇主一起
Averell:你提到使用'setter'方法在模型中封装......。我不明白你的意思 - 你能解释一下这是如何工作的(或者直接引导我去其他地方的例子)?在tsdbrown的回答中,我设法创造了我想要的行为......如果有更优雅的方式来完成同样的事情,我很乐意学习如何。
非常感谢。
感谢tsdbrown回答current_user.save问题!
答案 0 :(得分:2)
您在current_user对象上设置它然后重定向。在重定向上,我假设您的应用程序将重新加载current_user,在这种情况下,它将消失,因为您没有保存它。 (如果你想保存它,请在重定向之前调用current_user.save)你正在将employer.id/current_user.user_type_id传递给home动作,所以你应该在那里接受params [:id]
这有帮助吗?如果没有,也许我不理解你的问题。
答案 1 :(得分:1)
如前所述,您当前的问题是您不保存记录。也就是说,您的模型看起来有点尴尬,根据类型字段链接到不同的表。
我自发的想法是考虑
如果你真的想坚持你的方法,它至少应该被封装到模型中,所以你传入用户类型(例如employee)对象,并且所有字段都在setter方法中自动设置。 你应该使用Rails的多态关联。
另外,我不太清楚你想在这里完成什么:
1.times {@employer.addresses.build}
Rails实际上提供了您想要的功能。检查documentation for the features here.。在我们发布更多示例之前,您可以查看this question,它看起来很像您想要做的。