每个用户拥有多个角色,每个角色属于一个用户。有三种类型的角色 - 当有人注册并创建新用户时,会自动创建类型1和类型2。用户可以随后通过表单随时创建角色类型3。因此,我需要一种方法来告诉Personas控制器中要创建的Persona类型的创建操作。我知道的唯一技术是将persona_type传递给create动作。麻烦的是,这使得它可以进行大规模分配攻击。 persona_type不应由用户选择。我的问题是,如何在不允许参数中包含persona_type的情况下告诉创建动作persona_type?
我相信STI或多态关联可能是解决这个问题的方法。然而,当三种角色类型之间几乎没有差别时,两者似乎都有些过分。即使这些是最好的解决方案,我认为这是一个有趣的问题,知道如何在persona_params中避免使用persona_type会很好。
在人物角色控制器中:
def create
@persona = current_user.personas.build(persona_params)
if ( @persona.persona_type==1 || @persona.persona_type==2 )
if @persona.save
# not sure what to do here
else
# not sure what to do here
end
end
if @persona.persona_type==3
if @persona.save
flash[:success] = "Welcome, " + @persona.name
redirect_to @persona
else
render 'new'
end
end
end
.
.
.
private
def persona_params
params.require(:persona).permit(:name, :persona_type)
end