【问题标题】:Automatically add parent model id in nested resources在嵌套资源中自动添加父模型 ID
【发布时间】:2011-03-28 17:22:10
【问题描述】:

在 Rails 3 中使用嵌套资源路由,例如:

resources :magazines do
  resources :ads
end

定义了诸如magazine_ad_path之类的助手,我必须将杂志和广告都传递给它,如果我只是引用广告,这很不方便:

magazine_ad_path(@ad.magazine, @ad)

有没有一种很好的方法来设置一个 ad_path 帮助器,它接受 @ad 并返回包括杂志 ID 在内的适当地址? (这也将允许使用link_to @adredirect_to @ad等,它们会自动调用与模型类对应的ad_path帮助器。)

【问题讨论】:

    标签: ruby-on-rails resources nested url-routing helper


    【解决方案1】:

    Shallow Routing 似乎正是您想要的。您可以按如下方式实现浅嵌套:

    resources :magazines do
      shallow do
        resources :ads
      end
    end
    

    resources :magazines, :shallow => true do
      resources :ads
    end
    

    只有索引和新动作是嵌套的。

    使用嵌套资源往往会生成长 URL,浅嵌套有助于删除某些操作不一定需要的部分(也包含父资源路由)(因为父资源可以从持久的子记录中派生) .

    【讨论】:

    • 这确实可行,但无论如何我都希望在 URL 中包含杂志 ID。 (在我的例子中,它实际上不是普通 ID;我使用的是friendly_id,并且广告标识符在杂志上下文之外不一定是唯一的。)
    【解决方案2】:

    一个可能但丑陋的解决方案是:

    module RoutesHelper
      def ad_path(ad)
        magazine_ad_path(ad.magazine, ad)
      end
    
      def ad_url(ad)
        magazine_ad_url(ad.magazine, ad)
      end
    
      def edit_ad_path(ad)
        edit_magazine_ad_path(ad.magazine, ad)
      end
    
      def edit_ad_url(ad)
        edit_magazine_ad_url(ad.magazine, ad)
      end
    
      ...
    end
    
    [ActionView::Base, ActionController::Base].each do |m|
      m.module_eval { include RoutesHelper }
    end
    

    不幸的是,这有一个缺点,我必须为 _path_url 定义不同的助手,因为 redirect_to 使用 _url 助手,我必须手动编写 edit_ 助手(也许我'我错过了一些;不确定),而且很丑。

    【讨论】:

      【解决方案3】:

      我喜欢在这种情况下使用的一种解决方案是让实例返回自己的路径,如下所示:

      class Ad
        def path action=nil
          [action, magazine, self]
        end
      end
      

      那么在你看来,你可以使用这个数组作为多态路由:

      link_to @ad.path
      link_to @ad.path(:edit)
      

      当然它也适用于redirect_to等

      【讨论】:

      • 不错的方法。不过,我只是不认为模型是添加方法的最佳位置。我宁愿把它放在 helper 中,甚至放在 lib 文件夹中的某个地方。
      猜你喜欢
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 2021-09-23
      • 2015-12-21
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多