рельсы с ajax, путаница с response_to

у меня есть система голосования, и я хотел бы, чтобы ответ на голосование был асинхронным.

в моем представлении "шоу" у меня есть...

<%= 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

<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. Я пытался поместить такие вещи, как redirect_to урок_путь (урок), а также визуализировать «оценку», но изображения для голосования не обновляются.

может кто-нибудь помочь? Спасибо!

ОБНОВЛЕНИЕ @ dhoelzgen

я поменял на...

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

я ставлю рендеринг :score, :layout => false и в другие мои действия.

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

<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))

в моих уроках.js.coffee.

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


person Sasha    schedule 17.04.2012    source источник


Ответы (1)


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

Визуализируйте партитуру без макета, как это

render :score, :layout => false

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

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

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

person dhoelzgen    schedule 17.04.2012
comment
Нет, это будет просто использовать рендер без repond_to. - person dhoelzgen; 17.04.2012
comment
хм, вроде не меняется. я что-то пропустил? я снова немного отредактировал свой пост. я добавил down_arrow - person Sasha; 17.04.2012
comment
Вы привязываете ajax:success к своему div с классом .up_arrow. Попробуйте привязать его к фактической удаленной ссылке (а не к окружающему div). - person dhoelzgen; 18.04.2012
comment
извините, я все еще совсем новичок в этом. что вы подразумеваете под фактической удаленной ссылкой? этот ajax сбивает с толку... - person Sasha; 18.04.2012
comment
Нет проблем, я изменил свой ответ выше, чтобы уточнить, что я имею в виду. $('.up_arrow a') — это новый элемент, к которому я привязываю событие, потому что это удаленная ссылка, которая запускает событие, связанное с div, окружающим эту ссылку, и никогда не вызывается. - person dhoelzgen; 18.04.2012
comment
давайте продолжим это обсуждение в чате - person Sasha; 18.04.2012
comment
эй, dhoelzgen, я не знаю, получил ли ты мой последний чат (это был мой первый раз, когда я использовал чат, поэтому я не знаю, как все работает), но мне интересно, ты когда-нибудь снова будешь свободен? в любое время было бы хорошо для меня. я постараюсь изо всех сил, чтобы соответствовать вашим временным рамкам. большое спасибо еще раз. не могли бы вы дать мне примерное время, может быть? - person Sasha; 18.04.2012
comment
это работает =) все, что мне нужно было сделать, это заменить .bind на .live в coffeescript - person Sasha; 19.04.2012