Платформа Rails не является неправильной для отправки вас по этому URL, поскольку вы установили для form_with :url
значение posts_path
. Это равно /posts
.
То, что вы пытаетесь сделать, это изменить действие формы в зависимости от выбранного содержимого. Для этого вам понадобится JavaScript для изменения действия формы на лету.
Вот упрощенный пример:
приложение / просмотров / some_directory / some_file.html.erb
<%= form_with url: posts_path, method: :get, local: true do |form| %>
<% options = {include_blank: 'Post titles'} %>
<% html_options = {
class: 'selectbooktitle form-control',
'data-change-form-action-with-value': true,
} %>
<%= form.collection_select :post_path, Post.all, method(:post_path), :title, options, html_options %>
<%= form.submit 'Search', class: 'btn btn-outline-success'%>
<% end %>
приложение / активы / JavaScripts / some_file.coffee
initChangeFormActionWithValue = (selectElement) ->
selectElement = $(selectElement)
closestAncestorForm = selectElement.closest('form')
selectElement.on 'change', ->
closestAncestorForm.attr 'action', selectElement.val()
$(document).on 'turbolinks:load', ->
$('select[data-change-form-action-with-value="true"]')
.each -> initChangeFormActionWithValue(this)
Теперь при изменении значения выбора форма обновляется значением выбранного параметра (который содержит путь публикации). И когда вы отправляете запрос, вы запрашиваете GET /posts/:id
.
Примечание: Это упрощенное решение. Который запрашивает GET /posts/:id
выбранного сообщения. Однако значения формы также представлены. Вы можете оставить их без присмотра, но должны хотя бы знать, что их там нет. Так что вы не удивитесь, когда увидите в шоу post_path или , отправив параметров.
Кроме того, если вы вообще не меняете выбор при нажатии кнопки отправки, вы в настоящий момент просто запрашиваете GET /posts
. А если вы измените значение на сообщение и вернетесь к 'Post titles'
(пустое значение), действие очищается. Это означает, что вы получите текущий URL.
В качестве альтернативы вы можете использовать текущее решение. Чем в вашем PostsController # index перенаправить на PostsController # show , если присутствует params[:post_id]
.
class PostsController < ApplicationController
def index
return redirect_to post_path(params[:post_id]) if params[:post_id]
# other index code
end
end