2012-04-17 2 views
0

У меня есть система голосования, в которой я хотел бы, чтобы голосовая реакция была асинхронной.рельсы с ajax, reply_to confusion

на мой взгляд, 'шоу' Я ...

<%= render 'score' %> 

, который оказывает

<% if @user.voted?(@lesson) %> 
    <%= render 'voted' %> 
<% else %> 
    <%= render 'unvoted' %> 
<% end %> 

и в свою очередь, оказывает мой _voted.html.erb

#will display different images, colored or not based on selection 
    <% if @user.up_voted?(@lesson) %> 
     <div class = "up_arrow"> 
      <%= link_to image_tag("up_color.png", alt: "Uncheck vote"), 
       clear_vote_lesson_url(@lesson), :method => :post, remote: true %> 
     </div> 
     <div class="average_score"><%= @lesson.votes %></div> 
     <div class= "down_arrow"> 
      <%= link_to image_tag("down_uncolor.png", alt: "Vote down"), 
       down_vote_lesson_url(@lesson), :method => :post, remote: true %> 
     </div> 
    <!-- user down voted then --> 
    <% else %> 
     <div class = "up_arrow"> 
      <%= link_to image_tag("up_uncolor.png", alt: "Vote up"), 
       up_vote_lesson_url(@lesson), :method => :post, remote: true %> 
     </div> 
     <div class="average_score"><%= @lesson.votes %></div> 
     <div class= "down_arrow"> 
      <%= link_to image_tag("down_color.png", alt: "Uncheck vote"), 
       clear_vote_lesson_url(@lesson), :method => :post, remote: true %> 
     </div> 
    <% end %> 

и мой unvoted.html.erb is

<div class = "up_arrow"> 
<%= link_to image_tag("up_uncolor.png", alt: "Vote up"), 
    up_vote_lesson_url(@lesson), :method => :post, remote: true %> 
</div> 
<div class="average_score"><%= @lesson.votes %></div> 
<div class= "down_arrow"> 
    <%= link_to image_tag("down_uncolor.png", alt: "Vote down"), 
     down_vote_lesson_url(@lesson), :method => :post, remote: true %> 
</div> 

, а затем, наконец, в мой контроллер у меня есть ..

def up_vote 
    lesson = Lesson.find(params[:id]) 
    current_user.up_vote!(lesson) 

    respond_to do |format| 
     format.html { render :action => 'show'} 
     format.js { ????????  } 
    end 
end 

у меня есть еще несколько таких действий, как down_vote, но его очень похожи.

Я предполагаю, что я не уверен, что положить в мой блок format.js. ive попытался убрать такие вещи, как redirect_to lesson_path (урок), а также отобразить «оценку», но изображения голосования не обновляются.

Может кому-то помочь? благодаря!

UPDATE @ dhoelzgen

я изменил его ...

def up_vote 
    lesson = Lesson.find(params[:id]) 
    current_user.up_vote!(lesson) 
    render :score, :layout => false 
    #redirect_to lesson_path(lesson) 
end 

я поставил рендер: счет,: макет => ложным в моих действиях, а также.

и на мой взгляд, у меня есть

<div id="surrounding_container"> 
    <%= render 'score' %> 
</div> 

вместе с

$('.up_arrow') 
    .bind 'ajax:success', (event, data) -> 
    $('#surrounding_container').html($(data)) 

$('.down_arrow') 
    .bind 'ajax:success', (event, data) -> 
    $('#surrounding_container').html($(data)) 

в моем lessons.js.coffee.

Я что-то не хватает? изображения по-прежнему не изменяются асинхронно

ответ

1

У вас есть несколько вариантов, я бы предложил просто вернуть рендерную оценку (а не как js/json), а затем поместить ее в тег div.

Рендер счета без макета, как этого

render :score, :layout => false 

, а затем использовать JavaScript (CoffeeScript в моем примере), чтобы заменить содержимое сНа тега

$('.up_arrow a') 
    .bind 'ajax:success', (event, data) -> 
    $('#surrounding_container').html($(data)) 

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

+0

hmmm я отредактировал снова в своем сообщении. это то, что вы имели в виду? – Sasha

+0

Нет, это будет просто использовать рендер, без материала repond_. – dhoelzgen

+0

Хммм, похоже, не меняется. я что-то пропустил? Я снова отредактировал свой пост. Я добавил down_arrow – Sasha