【发布时间】:2018-10-13 12:02:10
【问题描述】:
我的应用有一个带有 :name 和 :short_name 的模型 msa。
在 msa 索引页面上,有一个包含所有 msa.name 的下拉菜单,因此用户可以路由到所选 msa 的显示页面。
这个功能是用一个collection_select来编码的,它路由到msa控制器中的一个自定义方法。
msa 索引视图:
<%= form_with url: 'msas/redirect', method: :post, local: true do |f| %>
<%= f.collection_select(:id, Msa.all, :id, :name)%>
<%= f.submit "Search" %>
<% end %>
msa 控制器重定向方法:
def redirect
@msa=Msa.find(params[:id])
redirect_to msa_path(@msa, short_name: @msa.short_name, id: @msa.id)
end
我希望它们读取 localhost:3000/search/:short_name,而不是读取 localhost:3000/msa/1 的路由。
我的路线.rb:
scope format: false do
resources :msas, :only => [:show], path: '/search', param: :short_name
end
resources :msas, :except => [:show]
一切似乎都正常,除了路线在浏览器中显示如下:
localhost:3000/search/Chicago?id=1
我尝试从重定向方法中删除 id:@msa.id,但最终出现此错误:
Couldn't find Msa without an ID
在 msa 控制器中关闭了 set_msa 方法。
我想知道两件事:a) 我是否偏离了典型的 Rails 约定太远,以及 b) 是否有办法做到这一点并且不向世界透露我的 msa 模型的 id#?
【问题讨论】:
-
使用 github.com/norman/friendly_id 这个 gem 并在 short_name 上创建 slug。它将确保生成的 slug 是唯一的以避免任何冲突
标签: ruby-on-rails ruby-on-rails-5 custom-routes