Ruby on rails 当前用户类型用户id=@雇主id

Ruby on rails 当前用户类型用户id=@雇主id,ruby-on-rails,controller,authlogic,Ruby On Rails,Controller,Authlogic,我正在构建一个系统,其中包含一个用户模型(使用AuthLogic进行身份验证)和三个模型中的三种用户类型:其中一个模型是Employer。这三个模型中的每一个都有许多:users,:as=>:authenticable 我首先让一个新的网站访问者创建他们自己的“用户”记录,包括用户名、密码、用户类型等 创建后,用户将被发送到三个模型之一的“新建”操作。因此,如果他们告诉我们他们是雇主,我们会将_重定向到:controller=>“雇主,:action=>“新” 问题:当雇主提交时,我想将当前用户

我正在构建一个系统,其中包含一个用户模型(使用AuthLogic进行身份验证)和三个模型中的三种用户类型:其中一个模型是Employer。这三个模型中的每一个都有许多:users,:as=>:authenticable

我首先让一个新的网站访问者创建他们自己的“用户”记录,包括用户名、密码、用户类型等

创建后,用户将被发送到三个模型之一的“新建”操作。因此,如果他们告诉我们他们是雇主,我们会将_重定向到:controller=>“雇主,:action=>“新”

问题:当雇主提交时,我想将当前用户类型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
------更新------

大家好,作为回应:

我之所以使用这个表结构,是因为我的三个用户类型模型中的每一个都有许多不同的字段,并且每个都与其他模型有不同的关系,这就是我避免使用STI的原因

通过1.times(@employer.addresses.build),我以一种形式将employer模型连接到address多态表,因此我要求控制器构建一个新地址,以便与新雇主一起使用

Averell:您提到使用“setter”方法封装模型中的某些内容。我不知道您的意思-请您解释一下这是如何工作的(或者让我看看其他地方的示例)?有了tsdbrown的回答,我成功地创造了我想要的行为……如果有更优雅的方式来完成同样的事情,我想学习如何

非常感谢


感谢tsdbrown回答当前用户的保存问题!

您正在当前用户对象上设置它,然后重定向。在重定向时,我假定您的应用程序将重新加载当前用户,在这种情况下,它将消失,因为您没有保存它。(如果要保存它,请在重定向之前调用当前用户的保存)您正在将employer.id/current_user.user_type_id传递到home操作中,因此它应该在那里供您使用params[:id]进行拾取


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

你正在当前用户对象上设置它,然后重定向。在重定向上,我假设你的应用程序将重新加载当前用户,在这种情况下,它将消失,因为你没有保存它。(如果你想保存它,请在重定向之前调用当前用户。保存)您正在将employer.id/current_user.user_type_id传递到home操作中,因此它应该在那里供您使用params[:id]进行拾取


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

正如前面所说,你的直接问题是你没有保存记录。也就是说,你的模型看起来有点笨拙,根据类型字段链接到不同的表

我自发的想法是考虑

  • 将“用户”作为STI模型
  • 将“UserType”作为STI模型
  • 在它和每个用户类型之间有明确的关系(即,在用户模型中使用单独的字段)
如果你真的想坚持你的方法,至少应该将它封装到模型中,这样你就可以传入用户类型(例如employee)对象,所有字段都在setter方法中自动设置。你应该使用Rails的多态关联

此外,我不太确定您希望在这里完成什么:

1.times {@employer.addresses.build}
编辑多态关联
Rails实际上提供了您想要的现成功能。请选中。在我们发布更多示例之前,您可以看看哪些功能与您想要的功能非常相似。

正如前面所说的,您当前的问题是您没有保存记录。也就是说,您的模型看起来有点笨拙,根据类型链接到不同的表场

我自发的想法是考虑

  • 将“用户”作为STI模型
  • 将“UserType”作为STI模型
  • 在它和每个用户类型之间有明确的关系(即,在用户模型中使用单独的字段)
如果你真的想坚持你的方法,至少应该将它封装到模型中,这样你就可以传入用户类型(例如employee)对象,所有字段都在setter方法中自动设置。你应该使用Rails的多态关联

此外,我不太确定您希望在这里完成什么:

1.times {@employer.addresses.build}
编辑多态关联
Rails实际上提供了您想要的开箱即用的功能。在我们发布更多的示例之前,您可以先看看哪些功能与您想要的功能非常相似。

关于第一部分-我只是对“1.times”位感到好奇。它基本上是说“在块内做一次”“。如果你只是正常地编写语句,而没有任何内容,就会发生这种情况。似乎多态关联是适合你的方法。请看下面我修改过的答案,以及到另一个问题的链接和一个例子。关于第一部分,我只是对“1.times”这一位感到好奇。它基本上是说“在区块内做一次”。这就是如果你只是正常地编写语句,而没有任何东西围绕它会发生什么。似乎多态关联是适合你的方法。请参见下面我修改的答案,以及链接到另一个问题的示例。