Ruby on Rails select2 submit не работает - PullRequest
0 голосов
/ 09 мая 2018
  https://select2.org/getting-started/basic-usage

Я хочу найти заголовок сообщения, как в первом примере по ссылке выше.

Код:

<!-- search -->
      <div class="card my-auto">
        <%= form_with url: posts_path, method: :get, local: :true do |f| %>
          <div class="card-body">
            <p>Search for a Post title.</p>
            <%= f.collection_select(:post_id, Post.all, :id, :title, {include_blank: 'Post titles'}, {class:'selectbooktitle form-control'}) %>
            <hr>
            <div class="input-group">
                <span class="input-group-btn">
                  <%= f.submit 'Search', class: 'btn btn-outline-success'%>

                </span>
        <% end %>
        </div>
        </div>
      </div>

Это запрос с моего сервера при нажатии кнопки Отправить.

Started GET "/posts?utf8=%E2%9C%93&post_id=16&commit=Search" for 127.0.0.1 at 2018-05-09 14:18:51 +0200
Processing by PostsController#index as HTML
  Parameters: {"utf8"=>"✓", "post_id"=>"16", "commit"=>"Search"}
  Rendering posts/index.html.erb within layouts/application
  Post Load (0.3ms)  SELECT "posts".* FROM "posts"
  Post Load (0.3ms)  SELECT "posts".* FROM "posts" ORDER BY created_at DESC
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 4], ["LIMIT", 1]]
  Rendered posts/index.html.erb within layouts/application (10.2ms)
  Category Load (0.3ms)  SELECT "categories".* FROM "categories"
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
  Rendered layouts/_navbar.html.erb (4.5ms)
  Rendered layouts/_alerts.html.erb (0.4ms)
  Rendered layouts/_footer.html.erb (0.6ms)
Completed 200 OK in 59ms (Views: 55.0ms | ActiveRecord: 1.9ms)

Приводит к этому URL:

http://localhost:3000/posts?utf8=%E2%9C%93&post_id=20&commit=Search

это должно привести к следующему URL:

http://localhost:3000/posts/20

Что я делаю не так?

Заранее благодарю за любую помощь!

1 Ответ

0 голосов
/ 15 мая 2018

Платформа 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
...