Devise只适用于STI型号吗?

时间:2012-04-15 11:11:42

标签: ruby-on-rails controller devise helper

当你试图定制它的行为时,我在理解设计是如何工作方面遇到了麻烦。

我有两种不同的模式可供处理:社会协作者,并且注册表单必须在两者的相同视图中。
所以我必须通过编写一个处理两个模型的新控制器来覆盖“设计注册控制器创建方法”

痛苦来了。
从这里“Devise form within a different controller”和here,我知道我必须定义那些新助手,以便设计设计:

module ContentHelper
  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end
end

我要覆盖的create方法是:

def create
build_resource

if resource.save
  if resource.active_for_authentication?
    set_flash_message :notice, :signed_up if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, :location => after_sign_up_path_for(resource)
  else
    set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
    expire_session_data_after_sign_in!
    respond_with resource, :location => after_inactive_sign_up_path_for(resource)
  end
else
  clean_up_passwords resource
  respond_with resource
end

我无法弄清楚如何在不影响看守功能的情况下使其工作。 (build_resource)。有什么建议吗?我找不到没有STI 使用的任何解决方案!

2 个答案:

答案 0 :(得分:0)

听起来你将会有一个复杂的模型设置,可能会困扰你。如果您有两个不同的“用户”模型,可能您仍然拥有用户模型,然后还有社会和协作者模型,每个模型都是“has_one:user”。在注册时,您可以创建用户记录,以及社会或协作者方法(以选择者为准)。这种设计方式(以及您的所有身份验证)仅与用户模型相关联,并且保持简单。

一般来说,如果你发现自己正在与谷物作斗争,那么重新评估你在做什么是个好主意。除非你做一些开创性的事情,否则很有可能事情不应该那么困难。

答案 1 :(得分:0)

您可以在设计的所有视图中定义变量,例如

@type = :society

def resource_name
    @type
end

然后您可以使用原始控制器和视图,只需将其添加到AplicationHelper

PD:对于User.new,您可以在eval条件中使用字符串,例如

@res = "Society"

然后

@resource ||= eval(@res).new