Ruby on rails Rails:具有自定义行为的浅路由名称
假设我有两个模型Model1和Model2共享同一个控制器,它们都有许多Model3的实例 如何在两个模型中嵌套模型3,并获得路径:模型3_path@model而不是模型1\u模型3_path@model模型2和模型3_path@model 我想要我的3型_path@model函数的外观如下所示: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?
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。请仔细阅读这个问题。