Мое приложение имеет модель msa с :name
и :short_name
.
На странице индекса 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 / msa / 1, я хочу, чтобы они читали localhost: 3000 / search /: short_name.
Мои маршруты.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
, которая была отключена методом set_msa
в контроллере msa.
Мне интересно две вещи: а) слишком ли я отклонился от обычного рельсового соглашения, и б) есть ли способ сделать это?и не раскрыть ли id # моих моделей msa миру?