Question

This is driving me crazy! I have the two models Lion and Cheetah. Both inherit from Wildcat.

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

STI is used here.

They all get handled through the controller WildcatsController. There, I have a before_filer to get the type of wildcat from the params[:type] and all the other stuff to use the correct class.

In my routes.rb, I created the following routes:

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

If I now want to use the path helpers, that I get from the routes (lions_path,lion_path,new_lion_path, etc.), everything is working as expected, except the show and the new paths. For example lions_path returns the path /lions. The new path returns /lions/new?type=Lion. Same with the show path. When I try to enter /lions/new to my root domain it correctly adds the type param in the background.

So, my question is, why does Rails add the type parameter to the url if I use the path helper? And why only for new and show?

I am running Rails 4.0.0 with Ruby 2.0 using a fresh Rails app.

Was it helpful?

Solution

Why using type? Why not use inherited controllers?

resources :lions
resources :cheetahs

Then

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

OTHER TIPS

I just had this problem. You could try to shutdown the server, remove the /tmp directory and restart.

Rails routes and controller parameters

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top