Rails自定义路由,如何去掉?id=

Rails Custom route, how to remove ?id=

我的应用有一个带有 :name:short_name 的模型 msa。

在msa索引页面上,有一个下拉菜单所有msa.names用户可以路由到所选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/msa/1,不如让它们显示为 localhost:3000/search/:short_name.

我的routes.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# 透露给世界?

If there is a way to do this and not reveal the id# of my msa models to the world?

只需从 path helper

中删除 id
redirect_to msa_path(@msa, short_name: @msa.short_name)

并通过定义新方法并删除 set_msashow 方法的条目来解决错误

before_action :set_custom_msa, only: [:show]
before_action :set_msa, only: [:edit, :update,..] #remove the entry for show

private
def set_custom_msa
  @msa = Msa.find_by(short_name: params[:short_name])
end

Have I strayed too far from typical rails convention

没有!但如果你的最终目标是从 URL 中隐藏 :id 并使 用户友好 URLs,那我建议你看看friendly_id