迭代时使用thumbs_up gem

时间:2013-09-05 20:35:51

标签: ruby-on-rails ajax erb

我在我的应用程序中使用了thumbs_up gem,我正在尝试找出在迭代时在我的控制器中保存投票的最佳方法。

这是我的模特:

class Vendor < ActiveRecord::Base
    has_many    :inventory_items
    has_many    :items, through: :inventory_items
    has_many    :shopping_lists, through: :inventory_items

    acts_as_voteable
end

我现在的控制人员:

def vote_for_vendor
    # not sure what to put in here
end

def vote_against_vendor
    # not sure what to put in here
end

我目前的观点:

<% provide(:title, 'Stores') %>

<table class="table table-condensed table-hover">

<tr>
    <th>Name</th>
    <th>Address</th>
    <th>Favorite?</th>
</tr>

    <% @vendors.each do |v| %>
<tr>

    <td><%= v.name %></td>
    <td><%= v.address %></td>
    <td>
        <% if current_user.voted_for(v) %>
            <%= link_to 'unlike', vote_against_vendor_vendors_path(vendor_id: v.id), :remote => true %>
        <% else %>
            <%= link_to 'like', vote_for_vendor_vendors_path(vendor_id: v.id), :remote => true %>
        <% end %>
    </td>
</tr>

</table>

我见过的大多数示例都使用params([])将相关信息传递给控制器​​。我没有params,因为这只是我的索引页面,显示所有供应商。如何在迭代时使用此gem保存投票?提前谢谢!

在MrYoshi的帮助下更新了控制器

class VendorsController < ApplicationController

    def index
        @vendors = Vendor.all
    end

    def vote_for_vendor
        vendor = Vendor.find(params[:vendor_id])
        current_user.vote_for(vendor)

        respond_to do |format|
            format.js
        end
    end

    def vote_against_vendor
        vendor = Vendor.find(params[:vendor_id])
        current_user.vote_against(vendor)

        respond_to do |format|
            format.js
        end
    end
end

我的路线:

resources :vendors do
    collection { post :vote_for_vendor }
    collection { post :vote_agaist_vendor }
  end

当前服务器错误

于2013-09-06 10:07:29 -0700开始获取“/ vendors / vote_for_vendor?vendor_id = 4”for 127.0.0.1

AbstractController :: ActionNotFound(找不到VendorsController的动作'show'):

...........

在救援/布局中呈现/Users/#Myname/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb(0.5 MS)

2 个答案:

答案 0 :(得分:1)

我给你开始你想要的东西,你可以自己做其余的事情我想:

查看:

<% if current_user.voted_for(v) %>
  <%= link_to 'unlike', vote_against_vendor_vendors_path(vendor_id: v.id), :remote => true %>
<% else %>
  <%= link_to 'like', vote_for_vendor_vendors_path(vendor_id: v.id), :remote => true %>
<% end %>

控制器:

def vote_for_vendor
  vendor = Vendor.find(params[:vendor_id])
  current_user.vote_for(vendor)

  render :nothing => true
end

现在,如果你有上面的那个,那么vote_against非常简单;)

答案 1 :(得分:0)

对于“当前服务器错误”(AbstractController::ActionNotFound (The action 'show' could not be found for VendorsController):),您需要在config/routes.rb文件中添加成员路径,如下所示:

resources :vendors do
  member do
    post 'vote_for_vendor'
    post 'vote_against_vendor'
  end
end

您当前正在使用收集路由,这些路由适用于不需要特定ID的资源。我强烈建议您阅读路线上的Rails指南:

Rails Guide Documentation on Routes