【问题标题】:How do I create two objects, of two different classes, with one form and 'new' action?如何使用一种形式和“新”动作创建两个不同类的两个对象?
【发布时间】:2011-12-28 07:03:34
【问题描述】:

我正在构建一个用户可以扮演不同角色(如卖家、买家、代理等)的应用。所以我的计划是使用多态关联,为每个角色构建一个类,并将每个实例与一个用户帐户相关联。每个用户只能是其中一种类型,在阅读了该主题后,我得出结论认为这比使用 STI 更好,但如果我错了,请纠正我。

因此,该应用将为主要类型的用户帐户提供不同的注册屏幕。例如,在卖方注册表单中,用户将填写其用户帐户所需的详细信息以及卖方资料的特定字段。

所以这个表单应该创建用户对象,然后将卖家对象关联到前者。你怎么处理这个?我的猜测是,这个表单应该对应于卖家控制器的“新”动作,并且在创建动作中,用户帐户应该在最终创建卖家之前创建。

这是正确的吗?如果是这样,我应该从卖方控制器调用用户控制器创建操作,还是直接调用用户模型?如果是前者,请提供一些示例代码,因为我不确定应该如何从另一个控制器调用一个控制器。

编辑:我也考虑过使用多部分表单,这可能更容易,但在决定之前我想检查这个选项。

【问题讨论】:

    标签: ruby-on-rails model-view-controller controller polymorphic-associations


    【解决方案1】:

    您可以使用嵌套形式。一个用户只有一个角色。你可以查看这个 railscast:http://railscasts.com/episodes/196-nested-model-form-part-1,它解释了如何使用嵌套形式。您将在创建用户和角色时调用用户控制器。

    【讨论】:

    • 我有一个与@oalo 类似的应用程序设计,不幸的是,将accepts_nested_attributes_for 与多态关联一起使用似乎真的很糟糕。
    【解决方案2】:

    我会对这个问题采取不同的方法。有一个角色类。然后在用户类中创建方法。

    def can_assign_users?
      roles.map(&:name).includes('admin')
    end
    

    否则,您可能会在几年内拥有 50 个模型。此外,还有很多像这样工作的宝石,因此您可以利用它们。

    【讨论】:

    • 那么我将如何处理不同角色的额外列、方法和视图?这听起来对我来说也更复杂,特别是因为我将有两种,最多三种不同的用户类型。在这种情况下你怎么看?
    【解决方案3】:

    如果您一心想要这样做,我会说只需从卖方控制器的 create 方法中调用模型。 User 模型和 Seller 模型之间有什么类型的关系?因为你需要做这样的事情:

    def create
        user = User.create(params[:user])
        seller = Seller.new(params[:seller])
        seller.user_id = user.id
        seller.save
        redirect_to #wherever
    end
    

    在这里,我只是假设您在卖方模型中有一个 belongs_to :user。尽管如此,我还是建议您考虑使用像 cancan 这样的 gem 或其他处理角色的东西,而不是这种方法。

    祝你好运!

    【讨论】:

    • 不过,问题不是超出了授权范围吗? @oalo 使用术语“角色”,但实际上它听起来像是Profile。如果是这样的话,我认为有理由在UserProfile 之间使用多态关联,其中用户belongs_to :profile, :polymorphic => true
    • 是的,@Matt,我应该说配置文件,它更精确。卖家和普通用户的资料会有很大的不同,并且有很多不同的领域
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多