Ruby on Rails - отображать частичное в другом представлении через jQuery/Ajax

63
6

У меня есть ссылка в представлении моего метода show. Эта ссылка должна запустить метод создания этой модели в фоновом режиме, и, если это будет завершено, стиль и ссылка в этом представлении должны быть изменены. Я не могу управлять им, чтобы изменить кнопку другого метода.

Вид:

      <%= div_for @movie do %>
<p class="p p-details">
<div class="default_list">
<span class="label label-info">
<%= link_to "Add to Movie List", movies_path(:add_to_list => "default_list", :mashupdb_id => @movie.mashupdb_id),:method => "post", :remote => true, :class =>"a a-label" %>
</span>
</div>
</p>
<% end %>

Контроллер Создать действие:

  respond_to do |format|
format.html do
if request.xhr?
render :partial => "movies/delete_from_default_list", :layout => "movies/show", :status => :created
end
end
format.json { render :json => @movie }
end

JQuery:

jQuery(function($) {
// Callback for rendering via HTML
$('.movie a[data-type=html]').on('ajax:success', function(event, data, status, xhr) {
$(this).parents('div.movie').find('.label-info').replaceWith(data);
});
});

Если я попытаюсь это сделать, то это произойдет.

Он работает, если я использую ссылку ниже и мое шоу-действие.

<span class="label label-info">
<%= link_to "Add to Movie List", @movies, :remote => true, :class =>"a a-label" %>
</span>

Можно сделать частичный с другого контроллера? Что еще я могу сделать?

Редактировать:

Теперь я пытаюсь изменить ссылку с файлом js.erb.

Измененный контроллер:

  respond_to do |format|
format.html
format.js { render :content_type => 'text/javascript' }
format.json { render :json => @movie }
end

create.js.erb:

if ('<%= @list_operation.eql?('add_to_list_default_list') %>'){
$('#<%= dom_id(@movie) %> .default_list').html('<%= raw escape_javascript( render ("movies/delete_from_default_list") )%>');
}
else if ('<%= @list_operation.eql?('delete_from_list_default_list') %>'){
$('#<%= dom_id(@movie) %> .default_list').html('<%= raw escape_javascript( render ("movies/add_to_default_list") )%>');
}

partial _delete_from_default_list.html.erb

<span class="label label-important">
<%= link_to "Delete from Movie List", movies_path(:delete_from_list => "default_list", :mashupdb_id => @movie.mashupdb_id),:method => "post", :remote => true, :class =>"a a-label" %>
</span>

partial _add_to_default_list.html.erb

<span class="label label-info">
<%= link_to "Add to Movie List", movies_path(:add_to_list => "default_list", :mashupdb_id => @movie.mashupdb_id),:method => "post", :remote => true, :class =>"a a-label" %>
</span>

Если я щелкнул ссылку в первый раз, файл js, erb будет выполнен, и содержимое в моем представлении изменится. (@List_operation содержит "add_to_list_default_list")
Теперь, если я нажму на измененную ссылку, действие контроллера также называется успешно (@list_operation содержит "delete_from_list_default_list"), но ничего не происходит.

спросил(а) 2021-01-25T15:22:44+03:00 4 месяца, 4 недели назад
1
Решение
63

То, что я обычно делаю в этой ситуации, вызывает вызов ajax с помощью формата js, а в ответе js.erb -

$('xxxx').html("<%= raw escape_javascript( render :file => "xxxx/xxxx", :locals => { xxx: xxx ) %>");

сделать частичное в js.erb.

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

ответил(а) 2021-01-25T15:22:44+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема