我正在尝试在Rails 4.0中重新渲染一个视图,点击一个"星号"按钮,该按钮将一篇文章标记为收藏夹。
视图显示.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,还是我在这里缺少什么?如何在不调用关联路径的情况下自动刷新视图,避免刷新整个页面?谢谢!
最好的方法是使用 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) %>">