0

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

如何实现在两个模型中嵌套 Model 3 并拥有路径:model_3_path(@model)而不是model_1_model_3_path(@model)model_2_model_3_path(@model)

我希望我的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

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

4

2 回答 2

0

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

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

可以自己定义每一个(new_model3_path、model3_path、edit_model3_path、model3s_path),但我发现这个更简洁。

于 2013-06-27T10:50:40.813 回答
-1

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

于 2013-06-26T14:06:41.643 回答