Rails自定义路由,如何删除?id =
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails自定义路由,如何删除?id =相关的知识,希望对你有一定的参考价值。
我的应用程序有一个模型msa与:name
和:short_name
。
在msa索引页面上,有一个所有msa.names的下拉菜单,因此用户可以路由到所选msa的显示页面。
此功能使用collection_select进行编码,该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]
一切似乎都运行正常,除了路由在浏览器中显示如下:
本地主机: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
我是否偏离了典型的轨道惯例
没有!但如果您的最终目标是隐藏网址中的:id
并制作用户友好的网址,那么我建议您查看friendly_id
以上是关于Rails自定义路由,如何删除?id =的主要内容,如果未能解决你的问题,请参考以下文章