current_user.user_type_id = @employer ID

时间:2010-06-09 08:03:21

标签: ruby-on-rails controller authlogic

我正在使用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问题!

2 个答案:

答案 0 :(得分:2)

您在current_user对象上设置它然后重定向。在重定向上,我假设您的应用程序将重新加载current_user,在这种情况下,它将消失,因为您没有保存它。 (如果你想保存它,请在重定向之前调用current_user.save)你正在将employer.id/current_user.user_type_id传递给home动作,所以你应该在那里接受params [:id]

这有帮助吗?如果没有,也许我不理解你的问题。

答案 1 :(得分:1)

如前所述,您当前的问题是您不保存记录。也就是说,您的模型看起来有点尴尬,根据类型字段链接到不同的表。

我自发的想法是考虑

  • 将“用户”作为STI模型
  • 将“UserType”作为STI模型
  • 在它与每种用户类型之间建立显式关系(即在用户模型中使用单独的字段)

如果你真的想坚持你的方法,它至少应该被封装到模型中,所以你传入用户类型(例如employee)对象,并且所有字段都在setter方法中自动设置。 你应该使用Rails的多态关联。

另外,我不太清楚你想在这里完成什么:

1.times {@employer.addresses.build}

已编辑 - 多态关联

Rails实际上提供了您想要的功能。检查documentation for the features here.。在我们发布更多示例之前,您可以查看this question,它看起来很像您想要做的。