Rails 4.0中的路由,路径助手和STI

时间:2013-09-23 15:35:25

标签: ruby-on-rails ruby routes ruby-on-rails-4 sti

这让我抓狂!我有两个模型LionCheetah。两者均继承自Wildcat

class Wildcat < ActiveRecord::Base; end
class Lion < Wildcat; end
class Cheetah < Wildcat; end

此处使用STI。

它们都通过控制器WildcatsController处理。在那里,我有一个before_filertype获取野猫的params[:type]以及所有其他东西来使用正确的类。

在我的routes.rb中,我创建了以下路线:

resources :lions, controller: 'wildcats', type: 'Lion'
resources :cheetahs, controller: 'wildcats', type: 'Cheetah'

如果我现在想要使用路径助手,我从路线(lions_pathlion_pathnew_lion_path等)获得,一切都按预期工作,除了shownew路径。例如,lions_path会返回路径/lionsnew路径返回/lions/new?type=Lion。与show路径相同。当我尝试将/lions/new输入到我的根域时,它会在后台正确添加类型参数。

所以,我的问题是,如果我使用路径助手,为什么Rails会将type参数添加到网址?为什么只针对newshow

我使用新的Rails应用程序使用Ruby 2.0运行Rails 4.0.0。

2 个答案:

答案 0 :(得分:7)

为什么要使用type?为什么不使用继承的控制器?

resources :lions
resources :cheetahs

然后

class LionsController < WildCatsController
end

class CheetahController < WildCatsController
end

class WildCatsController < ApplicationController
  before_filter :get_type

  def index
    @objs = @klass.scoped
  end

  def show
    @obj  = @klass.find(params[:id])
  end

  def new
    @obj  = @klass.new
  end

  # blah blah

  def get_type
    resource = request.path.split('/')[0]
    @klass   = resource.singularize.capitalize.constantize
  end

答案 1 :(得分:-2)

我刚遇到这个问题。您可以尝试关闭服务器,删除/ tmp目录并重新启动。

Rails routes and controller parameters