在remote =>之后重新渲染视图“真实的”电话

时间:2013-11-13 05:12:56

标签: ruby-on-rails ajax

我正在尝试在单击“星形”按钮后在Rails 4.0中重新渲染视图,该按钮将文章标记为收藏夹。

视图 show.html.erb 如下:

<% if article.star == "yes" %>
  <%= link_to raw("<i class='fa fa-star fa-lg'></i>"), channel_article_star_path(@channel.id, article.id), method: :put, :remote => true %>
<% else %>
  <%= link_to raw("<i class='fa fa-star-o fa-lg'></i>"), channel_article_star_path(@channel.id, article.id), method: :put, :remote => true %>
<% end %>

然后,我有以下控制器 articles_controller.rb

class ArticlesController < ApplicationController
  def star_article
    @article = Article.find(params[:article_id])
    if @article.star == "no"
      @article.update_attributes(star: "yes")
    else
      @article.update_attributes(star: "no")
    end
    respond_to do |format|
      format.html { render :template => "channels/#{params[:channel_id]}" }
    end  
  end
end 

这个想法是通过再次渲染视图,在点击链接后我会得到正确的CSS类。现在,它正确地调用了star_article动作,因为刷新页面后我看到了正确的CSS类,但这只是在手动刷新之后。 respond_to方法似乎没有做到它应该做的事情。

我应该使用jQuery,还是我在这里缺少什么?如何在不调用关联路径的情况下自动刷新视图,从而避免刷新整个页面?谢谢!

1 个答案:

答案 0 :(得分:1)

最好的方法是使用action.js.erb格式通过ajax进行渲染

class ArticlesController < ApplicationController
  def star_article
    @article = Article.find(params[:article_id])
    if @article.star == "no"
      @article.update_attributes(star: "yes")
    else
      @article.update_attributes(star: "no")
    end
    respond_to do |format|
      format.js 
    end  
  end
end 

你应该创建一个名为star_article.js.erb的文件 有内容

$("#container_id").html("<%= escape_javascript(partial to re render name) %>">