#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. Извините за задержку, он все еще не работает. Вместо этого я задам новый вопрос.