jquery - Rails acts_as_votable ajax 不工作

标签 jquery ruby-on-rails ajax

我已经实现了acts_as_votable gem,它似乎工作正常。但我试图让按钮与 ajax 一起使用,控制台显示我在 put 方法上收到 500 错误。我也不确定要放置什么来渲染新图像。我在这里缺少什么想法吗?

这是我的 Controller :

def upvote
    @medium = Medium.find(params[:id])
    if current_member.voted_up_on? @medium
      @medium.unliked_by current_member
    else 
      @medium.liked_by current_member
    end
    respond_to do |format|
        format.html { redirect_to :back }
        format.js
    end
end

routes.rb

resources :media do
    member do
      put "favorite", to: "media#upvote"
    end
end

查看

<div class="actions_act">
    <span id="comment_act_btn media_buttons">
        <% if current_member.voted_up_on?(medium) %>
      <%= link_to image_tag("Favorite 3.png", class: "act_actions", title: "Comments", alt: "Comments") + 'Favorite', favorite_medium_path(medium), method: :put, :remote => true, :class => "btn favorite" %>
        <% else %>
      <%= link_to image_tag("Favorite 5.png", class: "act_actions", title: "Comments", alt: "Comments") + 'Favorite', favorite_medium_path(medium), method: :put, :remote => true, :class => "btn favorite" %>
        <% end %>
    </span>
</div>

upvote.js.erb

$("#comment_act_btn").html("<%= j  %>");

服务器日志

Started PUT "/activities/4/favorite" for 127.0.0.1 at 2014-02-13 14:23:47 -0600
Processing by ActivitiesController#upvote as JS
  Parameters: {"id"=>"4"}
    [1m[36mMember Load (1.0ms)[0m  [1mSELECT "members".* FROM "members" WHERE "members"."id" = 1 LIMIT 1[0m
    [1m[35mActivity Load (0.0ms)[0m  SELECT "activities".* FROM "activities" WHERE "activities"."id" = ? LIMIT 1  [["id", "4"]]
    [1m[36m (0.0ms)[0m  [1mSELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = 1 AND "votes"."voter_type" = 'Member' AND "votes"."votable_id" = 4 AND "votes"."votable_type" = 'Activity' AND "votes"."vote_scope" IS NULL AND "votes"."vote_flag" = 't'[0m
    [1m[35m (0.0ms)[0m  SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = 4 AND "votes"."votable_type" = 'Activity' AND "votes"."voter_id" = 1 AND "votes"."vote_scope" IS NULL AND "votes"."voter_type" = 'Member'
    [1m[36m (1.0ms)[0m  [1mbegin transaction[0m
    [1m[35mSQL (2.0ms)[0m  INSERT INTO "votes" ("created_at", "updated_at", "votable_id", "votable_type", "vote_flag", "vote_scope", "vote_weight", "voter_id", "voter_type") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)  [["created_at", Thu, 13 Feb 2014 20:23:47 UTC +00:00], ["updated_at", Thu, 13 Feb 2014 20:23:47 UTC +00:00], ["votable_id", 4], ["votable_type", "Activity"], ["vote_flag", true], ["vote_scope", nil], ["vote_weight", 0], ["voter_id", 1], ["voter_type", "Member"]]
    [1m[36m (127.0ms)[0m  [1mcommit transaction[0m
    Rendered activities/upvote.js.erb (3.0ms)
Completed 500 Internal Server Error in 151ms

ActionView::Template::Error (wrong number of arguments (0 for 1)):
    1: $("#comment_act_btn").html("<%= j  %>");
  app/views/activities/upvote.js.erb:1:in `_app_views_activities_upvote_js_erb__413243720_47347896'
  app/controllers/activities_controller.rb:41:in `upvote'

最佳答案

将按钮放入其自己的部分使事情变得更加容易。

media/_media.html.erb

<span id="med_fav_<%= medium.id %>_<%= medium.member.id %>">
    <%= render :partial => "media/favorite", :locals => {:medium => medium} %>
</span>

media/_favorite.html.erb

<% if medium.votes.size > 0 && medium.votes.size <= 99 && current_member.voted_up_on?(medium) %>
  <%= link_to favorite_medium_path(medium), remote: true, method: :put, :class => "btn favorite" do %>
      <%= image_tag("Favorite 3.png", class: "act_actions", title: "Unfavorite", alt: "Unfavorite") %><%= medium.votes.size %>
  <% end %>
<% elsif medium.votes.size > 99 && current_member.voted_up_on?(medium) %>
  <%= link_to image_tag("Favorite 3.png", class: "act_actions", title: "Unfavorite", alt: "Unfavorite") +'99+', favorite_medium_path(medium), remote: true, method: :put, :class => "btn favorite" %>
<% elsif medium.votes.size > 0 && medium.votes.size <= 99 %>
  <%= link_to favorite_medium_path(medium), remote: true, method: :put, :class => "btn favorite" do %>
      <%= image_tag("Favorite 5.png", class: "act_actions", title: "Favorite", alt: "Favorite") %><%= medium.votes.size %>
  <% end %>
<% elsif medium.votes.size > 99 %>
  <%= link_to image_tag("Favorite 5.png", class: "act_actions", title: "Favorite", alt: "Favorite") +'99+', favorite_medium_path(medium), remote: true, method: :put, :class => "btn favorite" %>
<% else %>
  <%= link_to image_tag("Favorite 5.png", class: "act_actions", title: "Favorite", alt: "Favorite"), favorite_medium_path(medium), remote: true, method: :put, :class => "btn favorite" %>
<% end %>

media/upvote.js.erb

$("#med_fav_<%= @medium.id %>_<%= @medium.member.id %>").html("<%= escape_javascript(render :partial => 'media/favorite', :locals => {:medium => @medium}) %>");

关于jquery - Rails acts_as_votable ajax 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21749160/

相关文章:

jquery - 创建一个 jquery 插件

css - Rails ERB 变量不响应 CSS

php - ajax 不响应所有数组数据

java - 如何使用ajax向服务器发送json数据

javascript - 是否可以通过使用远程链接返回 HTML(而不是 JS)数据?

jquery - 使用 jQuery 动画背景图像更改

javascript - 在函数内的 'if' 语句之外放置一大块代码?

ruby-on-rails - "bundle exec thin start -C config/thin.yml"没有启动瘦

ruby-on-rails - gem 的基本/主目录

javascript - 这是 jQuery 回调的错误吗?