我有一个充满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。
答案 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