On 12/05/2012, at 5:58 AM, Rodrigo Rosenfeld Rosas <[email protected]>
wrote:

 Today I had a strange behavior that made me suspect of jQuery at first,
but then it happened that I've faced two gotchas, one from CoffeeScript and
one from Rails itself.

I have something like this:

routes.rb
    post '/fields/:id.:format' => 'fields#show', as: :field, constraints:
{id: /\d+/}
    post '/fields/remove/:id' => 'fields#remove', as: :remove_field


If you look at mapper.rb you'll find the answer

https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/mapper.rb

Basically, :format is appended to every route unless you explicitly opt
out, I believe this started with 3.0?


routes.js.coffee.erb:

<% h = Rails.application.routes.url_helpers
 { fields: false, remove_field: true }.each do |named_route, expect_id| %>
  <% if expect_id %>
    window.<%= named_route %>_path = (id, format='.json')-> "<%= h.send
:"#{named_route}_path", '999' %>#{format}".replace('999', id)
  <% else %>
    window.<%= named_route %>_path = '<%= h.send :"#{named_route}_path" %>'
  <% end %>
<% end %>

It happens that my remove action is implemented like this:

def remove
    Field[params[:id]].update deleted: true
    head :ok
end

and in my client code I had something like this:

$.post remove_field_path(id, ''), => @refreshTree()

But as you have probably figured out the issue was that refreshTree was
never called.

That is because CoffeeScript will compare (format == null) and it happens
that ('' == null) in JavaScript:

 https://github.com/jashkenas/coffee-script/issues/947

I've already fixed my routes.js.coffee.erb to something like:

path = (id, format)-> format = '.json' if format is undefined; ...

But then I realized that I was expecting Rails request to fail in the first
place since my original route was:

post '/fields/remove/:id'

instead of

post '/fields/remove/:id(.:format)'

Then, reading the guide on Routing, I've realized that the (.:format) is
not needed. I was confused because of the last example in the generated
routes.rb to restore the Rails 1 routes style:

# match ':controller(/:action(/:id))(.:format)'

Shouldn't this comment be changed to the example below to avoid such
confusion?

# match ':controller(/:action(/:id))'

Also, we could include some example like this to give a hint about the
default (.:format) rule:

# post '/products/remove/:id', format: false, as: :remove_product


Does it make sense?

Sorry for the long e-mail but I thought that a bit of context on a real
case might help understand how such examples in the routes.rb could help
others.

Cheers,
Rodrigo.

 --
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Core" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-core?hl=en.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en.

Reply via email to