【问题标题】:Rails 3, shallow routesRails 3,浅层路线
【发布时间】:2011-04-08 23:32:51
【问题描述】:

在 rails 2.x 中,我使用了浅层路由,但这似乎在 rails 3 中缺失(至少在 API http://apidock.com/rails/ActionController/Resources/resources 中)。

当我在 rails 3 中传递这个选项时,它不会抛出任何错误,但我也没有得到我期望的所有路线。

Rails 3 路线.rb

  resources :users, :shallow=>true do
    resources :recipe do
      resources :categories do
        resources :sections do
          resources :details do
          end
        end
      end
    end
  end

使用 rails 2.x 等效生成的路由 missing 是(只是配方资源的示例):

GET new_recipe(我只有 new_user_recipe),并且

POST recipe(创建一个新的recipe,我只有POST user_recipe)

不会生成这些路由是有道理的,但我的旧代码通过在每个表单中传递 user_id 来解决它(不太优雅,同意)。

问题是:rails 3 中是否有关于“浅”路线的文档?有没有办法生成我在 rails 2.x 中缺少的路线?

谢谢, 迈克

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 routes


    【解决方案1】:

    您需要将 :shallow 选项应用于嵌套资源。这应该给你你想要的:

      resources :users do
        resources :recipe, :shallow=>true do
          resources :categories do
            resources :sections do
              resources :details do
              end
            end
          end
        end
      end  
    

    【讨论】:

    • 但是 API 文档(至少对于 2.x)说 :shallow 是继承的?我还是试了一下,但似乎没有成功。
    【解决方案2】:

    如果您查看 Rails 3 文档,您会发现 shallowActionDispatch::Routing::Mapper::Resources 上的实例方法,就像 resourceresourcesmatch 等一样。您应该能够用这样的东西嵌套浅层路线:

    shallow do
      resources :users do
        resources :recipe do
          resources :categories do
            resources :sections do
              resources :details
            end
          end
        end
      end
    end
    

    虽然它似乎只是将它们扩展到 2 个级别而不是完整的嵌套路由。查看rake routes 了解更多信息。

    【讨论】:

      【解决方案3】:

      您可以在 Rails Guides 站点上找到与嵌套或浅层路由相关的 Rails 3 文档。

      在提供有关如何嵌套路由的建议时,它特别指出,“资源的嵌套深度不应超过 1 级。”

      【讨论】:

        【解决方案4】:

        你只有 new_user_recipe 而不是 new_recipe 是合理的。为什么?因为从食谱的角度来看,每一个食谱都属于一个用户。

        还有一点就是

        resources :users, :shallow=>true do
          resources :recipe do
            resources :categories do
              resources :sections do
                resources :details do
                end
              end
            end
          end
        end
        

        完全一样

        resources :users do
          resources :recipe, :shallow=>true do
            resources :categories do
              resources :sections do
                resources :details do
                end
              end
            end
          end
        end
        

        :shallow 正如其他用户指出的那样被继承。想想看,:shallow 意味着一旦你确定你正在处理哪个资源,你就可以省略 URL 模式的左边部分。如果您将:shallow 放在资源的最外层,它应该具有与将其放在第二层相同的效果(示例中的配方)。因为在处理最外层资源(示例中的用户)时没有什么可省略的,所以它已经是 URL 模式的最左侧部分,不能省略。

        【讨论】:

          猜你喜欢
          • 2011-11-19
          • 1970-01-01
          • 2022-11-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多