Routing error/difference between RC and Beta4

In beta4 I could do this:

  resources :sections do     get :new, :on=>:member   end

But not with RC

If I change "new" to be something else, it will work

So it seems that "new" is now treated like a reserved word of sorts?

I really need to share the new method between "sections/new" and "sections/1/new" because my structure is a tree, so it makes sense to re-use

Example

  /section/1/new/

is so much cleaner (and dry) compared to

  /section/new/?parent=1 or   /section/1/new_child

Anyone have an opinion or suggestion?

cheers!

Just tried my project from scratch and generated using rails RC, rather than just changing the version in the Gemfile.

Didn't work, but was worth testing :slight_smile:

If anyone has an idea, or a thought of why this change was made, would be good to hear

cheers :slight_smile:

Did you open an issue for this? if not would you mind to do it so it can be discussed there?. Thanks.

Symbols are reserved in the Rails 3 Router DSL (they are used internally). Consequently, we do not expose `get :new` as public API, so we don't have tests for it causing its behavior change between releases due to internal needs.

Bottom line is: you should always use strings. :slight_smile:

It was done as part of some changes to add back support for custom new actions e.g. /posts/new/preview. To support this we added new scope to resources to match member and collection scopes. So whereas before 'new' would be added to the path scope, in RC it doesn't because new_scope has already added new to the path.

You can specify your routes as follows to get the effect you need:

  resources :sections, :id => /.+/ do     get :new, :path => 'new', :on => :member   end

However you'll still need to address the create, edit and update actions plus you'll need to override the :id constraint which doesn't allow slashes. Also the show action comes before the edit action so the greedy regexp needed for :id will match the edit url. You would be better off manually specifying each of the routes individually - it'll be easier than trying to bend resources to what you want:

  scope('sections', :controller => 'sections', :id => /.+/) do     get '/(:id)/new' => :new, :as => :new_section     get '/:id/edit' => :edit, :as => :edit_section     get '/:id' => :show, :as => :section     put '/:id' => :update, :as => :section     delete '/:id' => :destroy, :as => :section     get '/' => :index, :as => :sections     post '/(:id)' => :create, :as => :sections   end

This set of routes should do what you need.

Andrew