【问题标题】:Which rails controller should I use?我应该使用哪个导轨控制器?
【发布时间】:2013-04-02 02:58:14
【问题描述】:

在我的应用程序中Users 可以Like Programs。其中每一个都是一个模型,Like 是多态的。

在某个时候,我会希望看到所有 UsersLikeProgram 或所有 ProgramsUser Likes

usersprograms 控制器中使用likeslikers 控制器操作会更好吗?或者我应该将likes 控制器作为嵌套资源,同时具有usersprograms 操作(或检查正在使用哪个嵌套资源的索引)?

我知道所有这些都可以工作,但不确定 Rails 的最佳实践是什么。

【问题讨论】:

    标签: ruby-on-rails controller rails-routing


    【解决方案1】:

    我将构建您的应用程序,使其具有一个 UsersController 和一个 likes 成员操作,该操作返回用户喜欢的 Programs。然后有一个ProgramsController 和一个likers 成员操作,这会给出喜欢该程序的Users。

    为了进一步简化,您还可以在show 操作中加入用户的点赞(同样,在程序的show 操作中显示喜欢某个程序的用户),尽管您最终可能会获取更多show 操作中不需要的信息。

    【讨论】:

    • 在决定这些事情时是否有一般的经验法则?控制器越少越好吗?
    • 如果您创建了一个LikesController,它的资源将是一个“喜欢”,这听起来像是您场景中的“加入模型”。您的描述看起来像是您想要访问由特定用户或特定程序组织的“喜欢”,因此将喜欢呈现为 UsersController 或 ProgramsController 上的操作更有意义。
    【解决方案2】:

    放心,您将拥有一个 LikesController,其中的“创建”操作需要一个 user_id 和一个 program_id。用户很可能会登录(并且不会在 URL 中传递),并且创建一个 Like,将 program_id 传递给看起来像这样的 url 是有意义的:

    POST /likes, :params => { :program_id => ___ }
    

    您可能想要显示喜欢列表(索引页面),也许允许用户编辑和删除。如果是这种情况,您的所有操作都将在 likes_controller 上进行。通常,这取决于您的情况,但宁静的设计通常是正确的起点。

    【讨论】:

    • 类似是通过 AJAX 完成的。有创建和销毁操作,那部分工作正常。我需要 Likes 作为用户和程序下的嵌套资源,以便将操作保留在 likes 控制器中。在用户和程序控制器中似乎更容易......但感觉不是很 RESTful。
    • 我明白了。如果您正在寻找程序列表,那将在 ProgramsController 中的 index 操作上。它可能被 user_id 过滤,并且有一个类似 users/1/programs 的 url。但是,也有可能你真的想要喜欢用户/1/喜欢。如果是这样,我只需添加一个方法来过滤喜欢控制器上的索引操作中的喜欢。我使用的最后一个选项是为连接制作控制器 - UserLikesController 和 ProgramLikesController。唯一的动作是索引。这很好,因为您可以继承 Likes 并在过滤器等之前保留权限。
    • 哦,这是一个有趣的想法。我得试试看,看看效果如何。
    • 我的困境之一是可扩展性。现在我只有可以喜欢的程序,但我希望扩展它。这使得将它放在其他控制器中并忽略太多的连接控制器或喜欢控制器需要以一百万种不同的方式嵌套变得更容易。
    • 您可能会有指示父级的 url,它们根本不会是“多态的”,如果是这种情况,您仍然可以这样做并简单地根据显式对象获得喜欢。另一个想法是,您可能可以拥有一个控制器,该控制器期望可以在路由中定义的可爱类型和 id。所以你有所有的 url,但只有一个控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多