【问题标题】:Rails routes and controller parameters [closed]Rails 路线和控制器参数
【发布时间】:2013-11-13 20:15:21
【问题描述】:

我有这两个资源共享同一个控制器。到目前为止,我的方法是使用特殊类型参数进行路由:

resources :bazs do
  resources :foos, controller: :foos, type: :Foo
  resources :bars, controller: :foos, type: :Bar
end

路线按预期工作,但我所有的链接都是这样的:

/bazs/1/foos/new?type=Foo
/bazs/1/bars/new?type=Bar

而不是

/bazs/1/foos/new
/bazs/1/bars/new

如何在不弄乱链接的情况下将参数传递给控制器​​?

【问题讨论】:

    标签: ruby-on-rails ruby routes polymorphism


    【解决方案1】:

    试试这样的:

    resources :bazs do
      get ':type/new', to: 'foos#new'
    end
    

    对于需要 2 个 ID 的动词,

    resources :bazs do
      get ':type/:id', to: 'foos#show', on: :member
    end
    

    那么你就有了 params[:bazs_id] 和 params[:id]。

    你也可以这样做:

    resources :bazs do
      member do
        get ':type/new', to: 'foos#new'
        get ':type/:id', to: 'foos#show'
      end
    end
    

    为了始终拥有 params[:bazs_id]。

    对于您提到的根级冲突,您可以执行以下操作:

    constraints(type: /foos|bars/) do
      get ':type/new', to: 'foos#new'
      get ':type/:id', to: 'foos#show'
    end
    

    【讨论】:

    • 我可以这样做,但是我必须手动编写每条路线。 =o(
    • 另外,这可能会弄乱我已经拥有的其他路线。
    • @rogi 我想您必须手动编写其他路由,因为您似乎不想使用 :bars 控制器并且 :bars 不能被视为常规资源名称。您已经拥有的其他路线是什么?
    • 是的,但我也必须像这样制作一些根级路由。以'bazs/1/'为前缀是可以的,但是当你得到'/:type/:id/*'时,问题就开始了
    • @rogi 在这种情况下,您可以只在没有 :type 部分的情况下将路由保留在 OP 中,并在 :foos 控制器中解析 request.fullpath 以获取它的类型部分。
    【解决方案2】:

    在您的路由中,type: 设置了一个附加在 URI 上的参数 type。另一种选择是,对于每个路由,定义defaults,它是只能由控制器访问的参数,不会出现在 URI 中。

    documentation on defaults 很好地解释了这一点。

    例子:

    resources :bazs do
      resources :foos, controller: :foos
      resources :bars, controller: :foos
    end
    

    【讨论】:

    • 这也不行。
    • 刚刚得到相同的结果。
    • 你希望看到什么?
    • /bazs/1/foos/new/bazs/1/bars/new
    • 查看我的编辑。你根本不需要typedefaults
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多