我的应用程序有一个模型 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)
并通过定义一个新方法并删除show
set_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