我的应用程序有一个带有:name和:short_name的msa模型。
在msa索引页上,有一个所有msa.names的下拉菜单,以便用户可以路由到选定的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。
我的routes.rb:
scope format: false do
resources :msas, :only => [:show], path: '/search', param: :short_name
end
resources :msas, :except => [:show]一切似乎都正常,除了浏览器中的路由如下:
本地主机:3000/search/芝加哥?id=1
我尝试从重定向方法中删除id:@msa.id,但最后出现了以下错误:
Couldn't find Msa without an ID这是从msa控制器中的set_msa方法中得到的。
我想知道两件事:( a)我是否偏离了典型的rails惯例;( b)是否有办法做到这一点,而不向世界展示我的msa模型的id#?
发布于 2018-10-13 12:29:27
如果有办法做到这一点,而不向世界展示我的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隐藏在URL中并使用户友好的URL,那么我建议您查看friendly。
https://stackoverflow.com/questions/52792712
复制相似问题