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 =的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

VSCode自定义代码片段11——vue路由的配置

如何将自定义 RESTful 路由添加到 Rails 应用程序?

要映射到 rails 4 中的自定义路径的资源路由

Rails 路由:将自定义路由添加到标准操作列表