Named routes inserting a . instead of a /

2019-08-05 05:01发布

问题:

I've been having trouble with named routes in rails 4 (Named route for non resource nesting).

I've moved onto something else, but still struggling with the same problem of named routes for non resource urls.

This is my route from rake routes:

         GET    /messages/:id/report/:reply_token(.:format)     messages#report
messages POST   /messages(.:format)                             messages#create

and my routes.rb

resources :messages, only: [:create] do
  member do
    get 'report/:reply_token', :action => 'report'#, :as => :message
  end
end

Because of the problem I had in my post linked at the top, I'm trying to get a url to the /messages/:id/report/:reply_token route by doing the following:

"#{messages_url(@message, :host => "localhost:3000")}/report/#{@message.reply_token}"

But it's giving me this:

http://localhost:3000/messages.110/report/6bBw22TdaRYcQ3iVzW1ZwA

Why is there a . between the 'messages' and the '110' (message_id)?

Instead of @message, I've also tried @message.id in the messages_url(). I've also tried this: report_message_path(message_id: @message.id, reply_token: @message.reply_token) but got the same error as in my question linked above. I've also tried message_url() instead but it gives undefined method 'message_url'.

回答1:

You are mixing up routes. messages_url is to generate a URL for create action which does not have ID in its route. Rails assumes 110 is the format and uses the second route (which is named as messages)

messages POST   /messages(.:format) 

As a solution, name your route like this and also add show action

resources :messages, only: [:create,:show] do
  member do
    get 'report/:reply_token', :action => 'report' , :as => :custom_message
  end
end

And,

custom_message_url(@message, :host => "localhost:3000")

More about naming routes here.

Answerd here already - Rails _path helper generating path with format not id