【问题标题】:Two actions for one route in RailsRails 中一条路线的两个动作
【发布时间】:2014-01-24 16:30:12
【问题描述】:

我有这样的问题:
我有两个模型:UserPage
UsersPages 有字段 url.
所以我有路线
get ':url' => 'users#show'get ':url' => 'pages#show'
我应该如何从这条路线重定向到 users#showpages#show 操作之一?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    您首先需要一个代理操作,该操作检查 url 是用户还是搜索数据库的页面,然后调用实际操作

    类似

    get 'users/:url', to: 'users#show', as: 'show_user'
    get 'pages/:url', to: 'pages#show', as: 'show_page'
    get ':url', to: 'application#user_or_page'
    

    在应用控制器上

    def user_or_page
      if u = User.find_by_permalink(params[:url])
        redirect_to show_user_path(u)
      elsif p = Page.find_by_permalink(params[:url])
        redirect_to show_page_path(p)
      else
        # do something with an invalid url
      end
    end
    

    如果你愿意,我想你可以渲染一些模板而不是重定向,但我会使用重定向

    【讨论】:

    • 我知道这个解决方案,但我需要没有 users/pages/ 的链接。我想将这部分代码移动到两个控制器。
    • 正如我最后所说,您可以渲染模板而不是重定向,只需执行 'render template: "users/show"'
    • 谢谢。我会这样做
    • 确保执行所有 before_filters/actions 并实例化模板所需的所有变量
    【解决方案2】:

    url 和 action 之间存在一对一的关系。所以 /url 可以到 user#show 或 pages#show,但不能同时到。

    听起来您可能需要两条单独的路由,一条用于 /users/url 和 /pages/url,在这种情况下,您可能需要类似...的路由

    match 'users/url' => 'users#show'
    match 'page/url' => 'pages#show'
    

    【讨论】:

    • 这绝对是构建路线的更好方法。
    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 2016-07-07
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多