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_msa
中 show
方法的条目来解决错误
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
我的应用有一个带有 :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_msa
中 show
方法的条目来解决错误
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