使用ajax的rails,respond_to混乱

时间:2012-04-17 07:04:01

标签: ruby-on-rails ajax voting

我有一个投票系统,我希望投票回复是异步的。

在我的“节目”视图中,我有......

<%= 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 lesson_path(课程)这样的东西,并渲染“得分”,但投票图像没有得到更新。

有人可以帮忙吗?谢谢!

更新@dhoelzgen

我把它改成了......

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

我把渲染:得分,:布局=&gt;我的其他行为也是假的。

在我看来我有

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

我错过了什么吗?图像仍然不会异步更改

1 个答案:

答案 0 :(得分:1)

你有几个选项,我建议只返回渲染的分数(不是js / json),然后将它放到(周围)div标签。

在没有像这样的布局的情况下渲染得分

render :score, :layout => false

然后使用JavaScript(我的示例中为CoffeeScript)替换div标签的内容

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

或者,您可以将结果作为json返回并手动修改页面,但我认为上面的选项可以减少工作量。