Рельсы Пользовательский маршрут, как убрать? Id = - PullRequest
0 голосов
/ 13 октября 2018

Мое приложение имеет модель 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 миру?

1 Ответ

0 голосов
/ 13 октября 2018

Если есть способ сделать это и не открыть миру идентификатор id # моих моделей msa?

Просто удалите 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_id

...