当你试图定制它的行为时,我在理解设计是如何工作方面遇到了麻烦。
我有两种不同的模式可供处理:社会和协作者,并且注册表单必须在两者的相同视图中。
所以我必须通过编写一个处理两个模型的新控制器来覆盖“设计注册控制器创建方法”。
痛苦来了。
从这里“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 使用的任何解决方案!
答案 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