插入的命名路由。 代替 /

我在rails 4中的命名路由遇到了问题( 非资源嵌套的命名路由 )。

我已经转移到其他东西,但仍然在努力解决非资源url的命名路由问题。

这是我从rake routes

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

和我的routes.rb

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

由于我在顶部链接的post中遇到的问题,我正在尝试通过执行以下操作获取/ messages /:id / report /:reply_token路由的URL:

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

但它给了我这个:

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

为什么会有。 在’messages’和’110’(message_id)之间?

我还在messages_url()尝试了@ message.id,而不是@message。 我也尝试了这个: report_message_path(message_id: @message.id, reply_token: @message.reply_token)但是得到了与上面链接的问题相同的错误。 我也尝试过message_url()但它给出了undefined method 'message_url'

你正在混淆路线。 messages_url用于生成create操作的URL,该URL在其路由中没有ID。 Rails假设110是格式并使用第二条路径(命名为messages

 messages POST /messages(.:format) 

作为解决方案,请像这样命名您的路线,并添加show动作

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

和,

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

有关在此处命名路线的更多信息

这里已经回答了–Rails _path helper生成格式不是id的路径