2012-05-20 3 views
0

У меня есть две кнопки для вызова видео. Кнопка вызывает действие, установленное в моем видеоконтроллере.Что является самым простым способом обновления рельсов button_to после сообщения ajax?

В мой контроллер

def featured 
video = Video.find(params[:id]) 
video.nfeatured = params[:nfeatured] 
video.save 
respond_to do |format| 
    format.html { redirect_to :back } 
    format.js 
end 
end 

На мой взгляд

<td class="featured"> 
<% if video.nfeatured == false %> 
<%= button_to 'Feature', featured_network_video_path(network, video, 
:nfeatured => true), :remote => true, :class => :feature %> 

<% else %> 
<%= button_to 'Remove', featured_network_video_path(network, video, 
:nfeatured => false), :remote => true, :class => :unfeature %> 
<% end %> 
</td> 

Самый ненавязчивый способ изменить кнопку «Удалить» после успешного Ajax пост? Все остальное работает нормально. Я попытался сделать jQuery для переключения вызова в файле featured.js.erb, но это не сработало.

ответ

1

Я хотел бы сделать так:

<td class="featured"> 
<%= render :template => "videos/featured" %> 
</td> 

featured.html.erb:

<% if @video.nfeatured == false %> 
    <%= button_to 'Feature', featured_network_video_path(@network, @video, 
    :nfeatured => true), :remote => true, :class => :feature %> 

<% else %> 
    <%= button_to 'Remove', featured_network_video_path(@network, @video, 
    :nfeatured => false), :remote => true, :class => :unfeature %> 
<% end %> 

featured.js.erb

$(".featured").html("<%= j(render :template => "videos/featured", :handlers => [:erb]) %>"); 

И да, я думаю, что это не лучший путь. Я хотел бы получить более правильное решение.

Редакция: Для петли это решение не подходит. Вторая версия:

<% unless video.nfeatured %> 
    <%= button_to 'Feature', featured_network_video_path(network, video, 
    :nfeatured => true), :remote => true, :class => :feature %> 
    <%= button_to 'Remove', featured_network_video_path(network, video, 
    :nfeatured => false), :remote => true, :class => 'unfeature hidden' %> 
<% else %> 
    <%= button_to 'Feature', featured_network_video_path(network, video, 
    :nfeatured => true), :remote => true, :class => 'feature hidden' %> 
    <%= button_to 'Remove', featured_network_video_path(network, video, 
    :nfeatured => false), :remote => true, :class => :unfeature %> 
<% end %> 

в некотором файле кофе:

$('.featured').bind "ajax:success", -> 
    $(this).toggle() 
    $(this).closest('a').toggle() 

Я не уверен в этом коде (это, очевидно, нуждается в рефакторинге), но я надеюсь, что вы получите эту идею.

+1

Почему вы не используете 'j' вместо' escape_javascript'? Разве первое не помню? – jdoe

+0

Большое спасибо за ваш ответ ... Я получаю 500 ошибок сервера при обратном вызове. Он успешно сохраняет действие, но не делает представления правильно. Есть предположения? Мне также пришлось передавать локальные переменные, так как этот рендер находится внутри блока. –

+0

@jdoe, спасибо, я просто этого не знал) @ Kyle C, извините, я забыл, что вы должны либо передавать локальные параметры, либо использовать переменные экземпляра. Я предпочитаю второе решение. Вероятно, у вас есть ошибка, потому что вы не определили переменные '@ network' и' @ video' в действии 'featured'. См. Больше ошибок журналов, это помогает много. Я отредактировал ответ. –