1

当您尝试自定义其行为时,我无法理解设计的工作原理。

我有两种不同的模型要处理:SocietyCollaborator,并且它们的注册表必须在相同的视图中。
所以我必须通过编写一个处理这两个模型的新控制器来覆盖“设计注册控制器创建方法” 。

痛苦来了。
从这里“在不同的控制器中设计表单”和这里,我知道我必须定义那些新的助手,以使设计工作:

module ContentHelper
  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

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

我要覆盖的创建方法是这样的:

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

结尾

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

4

2 回答 2

0

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

@type = :society

def resource_name
    @type
end

然后你可以使用原来的控制器和视图,只需将它添加到 AplicationHelper

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

@res = "Society"

然后

@resource ||= eval(@res).new
于 2014-02-13T16:03:49.507 回答
0

听起来您将有一个复杂的模型设置,这可能会困扰您。如果您需要两个不同的“用户”模型,也许您仍然可以拥有一个用户模型,然后还拥有每个“has_one :user”的 Society 和 Collaborator 模型。这样在注册时您就可以创建用户记录,以及 Society 或 Collaborator 方法(无论选择哪个)。这样设计(以及您的所有身份验证)只是链接到用户模型并且它保持简单。

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

于 2012-04-15T13:05:38.417 回答