Ruby on rails Rails:具有自定义行为的浅路由名称

Ruby on rails Rails:具有自定义行为的浅路由名称,ruby-on-rails,custom-routes,nested-routes,Ruby On Rails,Custom Routes,Nested Routes,假设我有两个模型Model1和Model2共享同一个控制器,它们都有许多Model3的实例 如何在两个模型中嵌套模型3,并获得路径:模型3_path@model而不是模型1\u模型3_path@model模型2和模型3_path@model 我想要我的3型_path@model函数的外观如下所示: def model_3_path(model) if model.is_a? Model1 "/model1/#{model.id}/model3" elsif model.is_a?

假设我有两个模型Model1和Model2共享同一个控制器,它们都有许多Model3的实例

如何在两个模型中嵌套模型3,并获得路径:模型3_path@model而不是模型1\u模型3_path@model模型2和模型3_path@model

我想要我的3型_path@model函数的外观如下所示:

def model_3_path(model)
  if model.is_a? Model1
    "/model1/#{model.id}/model3"
  elsif model.is_a? Model2
    "/model2/#{model.id}/model3"
  end
end
我目前的进展:

concern :three { resources :model3, shallow: true }
resources :model1, concerns: :three
resources :model2, concerns: :three, controller: :model1, except: [:index] # /model2 isn't permitted

我似乎找不到正确的方法…

如果您想要一个不指定其父级的路径,只需将其作为顶级路由,而不是一个问题。

我找到了一个简单的解决方案:首先,我删除了model3中的浅路径。通过打开helper类并添加一个缺少定义的方法,这很容易实现:

def method_missing(method, *args, &block)
  super unless /model3s?_(path|url|uri)$/ =~ method.to_s
  sub_string = nil
  if args.first.is_a? Model1
    substring = 'model1'
  elsif args.first.is_a? Model2
    substring = 'model2'
  end
  self.send(method.to_s.gsub('model3', "#{substring}_model3"), *args, &block)
end

可以自己定义这些路径中的每一个新的\u model3\u path、model3\u path、edit\u model3\u path、model3s\u path,但我发现这一个更简洁。

我确实希望它们指定它们的父路径,我只希望命名的路由是泛型的,这取决于传入的参数,该参数可以是Model1或Model2。请仔细阅读这个问题。