iteye_11263 2011-01-06 10:09
浏览 337
已采纳

如何设计一个漂亮的路由

    先简单说一下我的情况:有一个posts的controller,它负责CRUD等一系列操作,现在有一个需求是列出“我评论过的文章”的列表,最初我是这样设计的

in app/controllers/posts_controller.rb

def my_replied 
  # ignore codes 
end

     这样写有一个好处,就是产生的路由很易懂,如浏览器的地址栏会显示/posts/my_replied,在ERB文件中书写路由时是my_replied_posts_path,这甚至和英文表达的方式几乎一致,所以这是一种漂亮的表达方式。

 

    现在突然需要列出很多和“我的”相关的需求,如“我小组中的文章”,“我回答过的”,“我自己发表的”等等,所以我打算把这个controller移到目录my下面,变成了app/controllers/my/posts_controller.rb,这时的action还和上面一样,但路由的写法就变了

in routes.rb

namespace :my do
  resources :posts do
    collection do
      get :my_replied
    end
  end
end

     这时在地址栏显示的内容就成了/my/posts/my_replied,看,有一个多余的“my”,在ERB文件中显得更加不易读,变成了my_replied_my_posts_path。

     不知道各位是否遇到过这个情况,或者在这个过程中我是否做了不必要的东西?


问题补充
ddl1st 写道
用path_prefix => '',把文件名隐藏

这样貌似不能将那个前缀隐藏吧, 它只会给路由添加额外的字符串

ps: 我当时在设计这个路由的时候还考虑了这么一个情况, 即通过路由可以猜到对应的文件在哪, 这样也算是易读的其中一方面吧. 所以隐藏"my"后感觉不是一个好的办法.
不知道这样是不是有点自己和自己矛盾了
  • 写回答

3条回答 默认 最新

  • langwangff 2011-01-11 14:31
    关注

    个人觉得用restful的方式比较好,应该尽量避免其他action的出现。
    “我的”相关的需求,如: “我评论过的文章”,“我小组中的文章”,“我回答过的”,“我自己发表的”这些只是一个筛选类型而已,可以通过一个参数即可如:type,都到index 方法处理就好,这样可以很清楚
    可以这样写:
    [code="ruby"]
    namespace :my do
    resources :posts
    end
    [/code]
    因此路由可以这样写:
    [code="ruby"]
    my_posts_path(:type=>'replied')
    my_posts_path(:type=>'group')
    my_posts_path(:type=>'answered')
    my_posts_path(:type=>'me')
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作