Rails认为新路线是一个id,并尝试使用#show方法

时间:2018-06-20 19:00:26

标签: ruby-on-rails

我有一个充满text_message记录的数据库。我正在尝试创建一个自定义的“列出所有短信”页面。

这是我的route.rb文件的相关部分:

resources :text_messages
get '/text_messages/all_messages', to: 'text_messages#all_messages'

我有标准的RESTful控制器方法,然后是我自己的all_messages方法:

def all_messages
  @text_messages = TextMessage.order('send_time desc')
end

但是,每当我访问“ localhost:port / text_messages / all_messages”时,都会收到错误消息:

  

ActiveMessage :: RecordNotFound在TextMessagesController#show

中      

找不到带有'id'= all_messages的TextMessage

因此,Rails在'text_messages /'之后得到了一些东西,并自动假定它是一个id,甚至认为它是一个字符串,并且完全忽略了我的路线。如何使用路由而不尝试使用show()?

我正在使用Rails 4.2。

2 个答案:

答案 0 :(得分:0)

您需要使用collection方法:

  

这将使Rails能够识别诸如   /text_messages/all_messages使用GET,并路由到all_messages操作   TextMessagesController中的。 (source

像这样更改您的路线:

resources :text_messages do
  get 'all_messages', on: :collection
end

在没有收集的情况下,诸如'text_messages/<a parameter>'之类的任何路线都会达到“显示”动作。

答案 1 :(得分:0)

这仅仅是因为您已定义

resources :text_messages

之前

get '/text_messages/all_messages', to: 'text_messages#all_messages'

默认情况下,资源添加一条路线

get '/text_messages/:id'

进入表演动作。这个ID可以是任何单词或任何东西。当前,当您尝试致电all_messages时,会将all_messages视为ID,然后执行显示操作并生成错误。

您可以通过两种方式解决此问题:

将自定义路线移至资源上方,如下所示:

get '/text_messages/all_messages', to: 'text_messages#all_messages'
resources :text_messages

使用资源作为收藏集

resources :text_messages do
  get 'all_messages', on: :collection
end

resources :text_messages do
  collection do
    get 'all_messages'
  end
end