Rails 5 соглашение об именовании файлов для отображения результатов запроса AJAX

#ruby-on-rails #ajax

#ruby-на-рельсах #ajax #ruby-on-rails

Вопрос:

Давайте предположим, что есть модель с именем City, и мы создаем форму поиска для поиска по названиям доступных городов в модели.

Необходимо ли называть частичную часть, которая будет отображаться как результат запроса AJAX _city.html.erb , только как?Если да, то почему? А если нет, то как мы можем назвать файл как-то иначе и использовать это? Возможно, нужно использовать несколько ситуаций AJAX для модели, например, добавление города, поиск и т. Д., Чтобы Все они отображали одну и ту же часть, что может быть не тем, чего желает разработчик.

Я пробовал разные имена, но ничего не получалось, кроме этого.
Мой маршрут поиска /cities_search использует GET метод, сопоставленный с cities#search .
Мое имя файла JS таково search.js.erb .

В index.html.erb:

 <%= form_tag cities_search_path, method: :get, remote: true do %>
  <%= text_field_tag :search, nil, required: true %>
  <%= submit_tag 'Search', name: nil%>
<% end %>
Search:
<div id="search-results">

</div>
  

JS — код:

 $("#search-results").empty();
<% if @foundcities %>
    $("#search-results").append("<%= j render @foundcities %>");
<% else %>
    $("#search-results").append("No city found");
<% end %>
  

Комментарии:

1. Пожалуйста, предоставьте свой вид и js-код

2. Это зависит от названия вашего действия

3. Добавлено @MoatazZaitoun

4. @Deepak Я пробовал это, я назвал файл _search.html.erb, у меня это не сработало.

Ответ №1:

<%= j render @foundcities %> это та часть, из-за которой необходимо конкретно назвать частичное. Просто вызывая render коллекцию объектов, вы используете схему именования по умолчанию для этого объекта (которая использует имя класса). если вы хотите что-то другое, попробуйте использовать другой render , например

 render :partial => 'my_partial_name', :locals => {:found_cities => @foundcities}
  

Обратите внимание, что вам нужно будет ссылаться на локальную переменную: found_cities в вашем частичном, а не в глобальном @foundcities

(также в rails принято отдавать предпочтение snake_case jammedtogetherwordscase ) 😉

Комментарии:

1. Спасибо за объяснение. Я попробовал ваш метод, он работает, но если я напишу что-нибудь еще в файл, например, условие IF или стиль, ничего не появится (хотя я смог сделать это в своем исходном коде, у меня было условие IF, а также стиль, например: <% if @foundcities %><span class="tag tag-primary"><%= @foundcities.name %></span> <% end %> )

2. Я не уверен, что понимаю проблему с этим … (также это, вероятно, считается новым вопросом… исправлена исходная проблема невозможности изменить частичное). Можете ли вы создать новый вопрос, основанный на этом, и включить пример кода и т. Д.? Вы можете вернуться к этому вопросу, чтобы они были связаны. Кроме того, если вы разместите ссылку на новый вопрос здесь, я получу уведомление и смогу посмотреть 🙂

3. Извините за задержку, я буду уведомлять вас всякий раз, когда я задам новый вопрос. Спасибо 🙂

Ответ №2:

Множество опций с рендерингом. В этом случае вы хотите:

 render :partial => 'partial_name', :collection => @foundcities
  

Тогда частичный файл будет называться «_partial_name.html.erb». В файле js.erb вы бы сделали что-то подобное:

 <% result = @foundcities ? render(:partial => 'partial_name', :collection => @foundcities) : "No city found" %>
$("#search-results").html("<%= j result %>");
  

Комментарии:

1. Я попробовал это в своем JS- $("#search-results").append("<%= render :partial => 'cities/search', :collection => @foundcities %>"); On терминале, он сообщает, что часть была отрисована, но ничего не отображается. Я удалил :collection атрибут, я смог распечатать, используя <%= @foundcities.name%> , но я не смог записать что-либо еще в файл, например, условие if или стиль.

2. В javascript / jquery функции добавления потребуется экранированная строка. Добавлено к ответу…

3. Извините за задержку, он все еще не работает. Вместо этого я задам новый вопрос.