在我的Rails投票系统中包含Ajax / JS

时间:2015-07-27 00:15:45

标签: javascript jquery ruby-on-rails ruby ajax

如何制作它以使其不刷新页面?相反它只会更新计数?任何帮助将不胜感激!

故事控制者:

def like
  like = Like.create(like: params[:like], user: current_user, story: @story)
  if like.valid?
    flash[:success] = "Your selection was succesful"
    redirect_to :back
  else
    flash[:danger] = "You can only like/dislike a story once"
    redirect_to :back
  end
end

index.html.erb:

<div class="pull-right">
    <%= link_to like_story_path(story, like: true), :method => :put, :remote => true  do %>
       <i class="glyphicon glyphicon-thumbs-up"></i><%= story.thumbs_up_total %>
    <% end %>

    <%= link_to like_story_path(story, like: false), :method => :put, :remote => true  do %>
       <i class="glyphicon glyphicon-thumbs-down"></i><%= story.thumbs_down_total %>
    <% end %>
</div>

Story.rb模型:

def thumbs_up_total
  self.likes.where(like: true).size
end

def thumbs_down_total
  self.likes.where(like: false).size
end

2 个答案:

答案 0 :(得分:1)

控制器应respond_to js“格式”,如Working with JavaScript in Rails中所述。

而不是redirect_to :back,使用有意义的状态代码进行响应,例如201表示成功(创建新资源时)或400表示错误请求。

请参阅RFC 2616, section 10 - Status Code Definitions

然后,在您的JS中,处理ajax:success事件。这也在Working with JavaScript in Rails中描述。

答案 1 :(得分:0)

让我举个例子: 首先更改您的StoriesController,如下所示:

def like
  @like = Like.create(like: params[:like], user: current_user, story: @story)
  if @like.valid?
    respond_to do|format|
     format.js
    end
  else
    respond_to do|format|
     format.js {render status: 403, js: "alert('You can only like/dislike a story once'"}
    end
  end
end

在故事视图目录中创建一个名为like.js.erb的文件,其中包含以下内容。

<% if @like.like %>
 var $element = $(".glyphicon.glyphicon-thumbs-up");
<% else %>
 var $element = $(".glyphicon.glyphicon-thumbs-down");
<% end %>
 var oldCount = parseIn($element.text());
 $element.text(oldCount + 1);

除了这些示例之外,你至少应该Rails Guide才能在rails中有效地使用ajax。这并不困难。