Rails 5: Почему я получаю ответ 500 при установке ввода в id партиала с переменной, но не при использовании строкового литерала? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть форма, которую я извлек в часть.

<%= form_with url: filtered_tags_path, class: 'filter-box' do %>
  <%= text_field_tag(:filter_by, '', id: 'filter-text-field', autocomplete: 'off') %>
<% end %>
<script>watch_form()</script>

В application.js есть скрипт, который отслеживает изменения в текстовом поле и запускает запрос после каждого нажатия клавиши:

function watch_form() {
  document.getElementById('filter-text-field').addEventListener('keyup', function(){
    Rails.fire(this.form, 'submit')
  })
}

Соответствующее действие выглядит следующим образом:

def create
  @labels = Label.by_search_term(params[:filter_by])
  respond_to do |format|
    format.js
  end
end

С этим шаблоном:

document.querySelector('.filter-results')
        .innerHTML = "<%= escape_javascript(render partial: 'filtered_results') %>"

Что делает:

<% if @labels.present? %>
  <% @labels.each do |label| %>
    <%= label_link(name: label.name, is_remote: true) %>
  <% end %>
<% else %>
  <div class="badge no-tags-badge">No tags found</div>
<% end %>

Короче, серия кнопок (завернутые в формы) отображаются.Например:

<form class="button_to" method="post" action="/issues?labels%5B%5D=ready" data-remote="true">
  <input class="label-badge" type="submit" value="+ ready">
  <input type="hidden" name="authenticity_token" value="yvWh51r/xHqLPb5V/qdfeiar/j9fqd/8FoZM0jnRFUFEHkdU5WlgVjyaIQi9viiiSfckjJypOhMnKAh29wjY3w==">
</form>

Когда я нажимаю кнопку, она отправляет свой запрос, и я получаю успешный ответ.

Я хочу иметь две отдельные формы.Первым делом я должен был поменять id текстового поля формы на переменную.

<%= form_with url: filtered_tags_path, class: 'filter-box' do %>
  <%= text_field_tag(:filter_by, '', id: filter_field_id, autocomplete: 'off') %>
<% end %>
<script>watch_form()</script>

Передав его в частичное примерно так:

<div class="filter-form">
  <%= render partial: 'filter_form', locals: { filter_field_id: 'filter-text-field' } %>
</div>

Форма ведет себя точно так же, как и раньше,Кнопки отображаются для каждого нажатия клавиши.Помимо маркера подлинности, пример кнопки выглядит точно так же.

<form class="button_to" method="post" action="/issues?labels%5B%5D=ready" data-remote="true">
  <input class="label-badge" type="submit" value="+ ready">
  <input type="hidden" name="authenticity_token" value="0xjeK53JZSF0nSA2kUT2MREgaCeQ8RlmK2wqcd2sCIZd8ziYIl/BDcM6v2vSXYHpfnyylFPx/Ikawm7VE3XFGA==">
</form>

Ничто не говорит о том, что есть что-то другое, но на этот раз при нажатии кнопки я получаю ответ 500.

В консоли я вижу:

rails-ujs.self-d109d8c5c0194c8ad60b8838b2661c5596b5c955987f7cd4045eb2fb90ca5343.js?body=1:212

POST http://localhost:3000/issues?labels%5B%5D=documentation&labels%5B%5D=ready 500 (Internal Server Error)

Rails.ajax  @ rails-ujs.self-d109d…a5343.js?body=1:212
Rails.handleRemote  @ rails-ujs.self-d109d…a5343.js?body=1:568
(anonymous) @ rails-ujs.self-d109d…a5343.js?body=1:169

Теперь я полностью потерялся.Я пытался привязать свой javascript к turbolinks:load слушателю событий, но это ничего не изменило.

Единственное, о чем я могу думать, это то, что это как-то связано с маркером аутентичности.

В чем разница между передачей строкового литерала в качестве идентификатора и использованием переменной?Почему мои перемены ломают вещи?Что мне нужно сделать, чтобы это работало?

ОБНОВЛЕНИЕ

Я обнаружил, что нажимая любые похожие кнопки на странице, в дополнение к тем, которые отображаются приизменение входа приводит к ответу 500.

ОБНОВЛЕНИЕ 2

Ошибка в консоли рельсов:

ActionView::Template::Error (undefined local variable or method `filter_field_id' for #<#<Class:0x00007fa891909b60>:0x00007fa88bf7ef78>
Did you mean?  file_field):
    1: <%= form_with url: filtered_tags_path, class: 'filter-box' do %>
    2:   <%= text_field_tag(:filter_by, '', id: filter_field_id, autocomplete: 'off') %>
    3: <% end %>
    4: <script>watch_form()</script>

app/views/issues/_filter_form.html.erb:2:in `block in _app_views_issues__filter_form_html_erb___4066184210884757332_70181011505480'
app/views/issues/_filter_form.html.erb:1:in `_app_views_issues__filter_form_html_erb___4066184210884757332_70181011505480'
app/views/issues/create.js.erb:14:in `_app_views_issues_create_js_erb__4388147431667736133_70180939735900'

От этогоЯ вижу, что я не передаю локальную переменную при рендеринге партиала в create.js.erb.Поэтому я изменил это на:

document.querySelector('.filter-form')
        .innerHTML = "<%= escape_javascript(render 'filter_form', locals: { :filter_field_id=> 'filter-text-field' }) %>"

Но я все еще получаю ту же ошибку.undefined local variable or method 'filter_field_id'

1 Ответ

0 голосов
/ 14 февраля 2019

Передача локальных переменных отличается, если вы не используете partial.Вам не нужно locals в вашем create.js.erb file.

См .: https://api.rubyonrails.org/classes/ActionView/PartialRenderer.html#class-ActionView::PartialRenderer-label-Rendering+the+default+case

# Instead of <%= render partial: "account", locals: { account: @buyer } %>
<%= render "account", account: @buyer %>

Поэтому ваш код должен быть либо:

document.querySelector('.filter-form')
        .innerHTML = "<%= escape_javascript(render 'filter_form', filter_field_id: 'filter-text-field' ) %>"

или

document.querySelector('.filter-form')
        .innerHTML = "<%= escape_javascript(render partial: 'filter_form', locals: { filter_field_id: 'filter-text-field' }) %>"
...