Rails 自定义路由,如何删除 ?id=



我的应用程序有一个模型 msa 具有:name:short_name

在 msa 索引页上,有一个包含所有 msa.names 的下拉菜单,以便用户可以路由到所选 msa 的显示页面。

此功能使用路由到 msa 控制器中的自定义方法的collection_select进行编码。

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。

我的路线.rb:

scope format: false do
resources :msas, :only => [:show], path: '/search', param: :short_name
end
resources :msas, :except => [:show]

一切似乎都正常,除了路由在浏览器中显示为这样:

本地主机:3000/搜索/芝加哥?id=1

我尝试从重定向方法中删除id:@msa.id,但最终出现此错误:

Couldn't find Msa without an ID

在 MSA 控制器中关闭了set_msa方法。

我想知道两件事:a(我是否偏离了典型的rails惯例,b(是否有办法做到这一点而不向世界透露我的msa模型的id#?

如果有办法做到这一点而不透露我的 msa 模型的 id# 走向世界?

只需从路径帮助程序中删除id

redirect_to msa_path(@msa, short_name: @msa.short_name)

并通过定义一个新方法并删除showset_msa方法的条目来应对错误,如下所示

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

我是否偏离了典型的轨道惯例太远

不!但是如果你的最终目标是从URL中隐藏:id并制作用户友好的URL,那么我建议你看看friendly_id

最新更新