不同的路由,但在Rails中使用相同的控制器进行模型子类

hol*_*den 1 routing routes ruby-on-rails subclass single-table-inheritance

我有一个Model属性,它有使用STI的子类,

我希望所有人都使用相同的控制器,只有不同的视图部分取决于子类.

Property
Restaurant < Property
Landmark < Property
Run Code Online (Sandbox Code Playgroud)

除了我不确定如何辨别控制器内的子类以呈现正确的视图之外,它还可以工作.IE浏览器./餐厅工作,并去物业控制器,但我不能告诉他们,他们想要餐厅的子类?

map.resources :restaurant, :controller => :properties
map.resources :properties
Run Code Online (Sandbox Code Playgroud)

Tom*_*kas 5

解决问题的一个简单方法是创建一个子控制器:

class RestaurantsController < PropertiesController
end
Run Code Online (Sandbox Code Playgroud)

在路线中,您可以将餐厅映射到餐厅控制器.

更新:或者你可以尝试这样的东西routes.rb:

map.resources :restaurants, :controller => :properties, :requirements => {:what => :Restaurant}
map.resources :properties, :requirements => {:what => :Property}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用前置过滤器来检查params [:what]并相应地改变行为.

例:

class PropertiesController < ApplicationController
  before_filter select_model

  def select_model
    @model = params[:what].constantize
  end

  def show
    @model.find(params[:id])
    ...
  end

  ...
end
Run Code Online (Sandbox Code Playgroud)