【问题标题】:Rails Custom route, how to remove ?id=Rails 自定义路线,如何删除 ?id=
【发布时间】:2018-10-13 12:02:10
【问题描述】:

我的应用有一个带有 :name:short_name 的模型 msa。

在 msa 索引页面上,有一个包含所有 msa.name 的下拉菜单,因此用户可以路由到所选 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/search/:short_name,而不是读取 localhost:3000/msa/1 的路由。

我的路线.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#?

【问题讨论】:

  • 使用 github.com/norman/friendly_id 这个 gem 并在 short_name 上创建 slug。它将确保生成的 slug 是唯一的以避免任何冲突

标签: ruby-on-rails ruby-on-rails-5 custom-routes


【解决方案1】:

如果有办法做到这一点并且不透露我的 msa 模型的 id# 走向世界?

只需从 path helper

中删除 id
redirect_to msa_path(@msa, short_name: @msa.short_name)

并通过定义一个新方法并删除set_msashow 方法的条目来解决错误,就像这样

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

我是否偏离了典型的 Rails 约定太远了

不!但如果您的最终目标是从 URL 中隐藏 :id 并制作 用户友好的 URL,那么我建议您查看 friendly_id

【讨论】:

  • 完美运行!谢谢
猜你喜欢
  • 2020-10-13
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多