我有一个我正在迭代的Vendors
列表,如下图所示。我正在尝试为每个供应商实现“收藏”或“喜欢”按钮。我在使用它时遇到了一些麻烦。这是我的观点:
vendors/show.html.erb
<% provide(:title, 'Stores') %>
<table class="table table-condensed table-hover">
<tr>
<th>Store Name</th>
<th>Store Address</th>
<th>Favorite</th>
</tr>
<% Vendor.all.each do |v| %>
<tr>
<td><%= v.name %></td>
<td><%= v.address %></td>
<td>
<div id="like">
<%= render 'layouts/like_button', :vendor => vendor %>
</div>
</td>
</tr>
<% end %>
</table>
我的控制器:
class VendorsController < ApplicationController
def index
@vendors = Vendor.all
end
end
class LikesController < ApplicationController
# respond_to :js
def create
@like = Like.create(likes_params)
@vendor = @like.vendor
render :toggle
end
def destroy
like = Like.find_by_id(:id)
like.destroy
@vendor = like.vendor
render :toggle
end
private
def likes_params
params.permit(:id, :user_id, :vendor_id)
end
end
我的部分_like_button.html.erb
:
<%= form_tag("/likes", method: "delete", action: "destroy", :remote => true) do %>
<%= hidden_field_tag(:id, vendor.likes.find_by_user_id(current_user.id).id) %>
<%= submit_tag("Unlike") %>
<% end %>
<%= form_tag("/likes", method: "post", :remote => true) do %>
<%= hidden_field_tag(:user_id, current_user.id) %>
<%= hidden_field_tag(:vendor_id, vendor.id) %>
<%= submit_tag("Like") %>
<% end %>
我的toggle.js.erb文件:
$("#like").html("<%= escape_javascript render('like_button') %>");
我目前收到此错误:'找不到ID = vendor的供应商' 因此不知何故,供应商这个词作为一个id被传入,但我不知道在哪里或如何解决它。我没有做过很多关于ajax或javascript的事情,所以我在这方面做得很好。我一直在尝试关注此示例应用的功能:https://github.com/sergeylukin/soquestion6482354/blob/master/app/views/products/show.html.erb
请帮忙吗?提前谢谢!
编辑说明
我已更新我的代码以反映我所做的更改。我不得不把它和表单混在一起,因为我在迭代时无法使form_for工作。我目前可以使用正确的参数通过ajax提交likes
,但我仍然无法提交unlikes
。我也没有看到我的页面更新了附加的新likes
。正如我所说,我在js和ajax上真的很绿,所以我不知道为什么。谢谢你的帮助!
模型更新
class Vendor < ActiveRecord::Base
has_many :inventory_items
has_many :items, through: :inventory_items
has_many :shopping_lists, through: :inventory_items
has_many :likes
has_many :liking_users, :through => :likes, :source => :user
end
class User < ActiveRecord::Base
has_many :shopping_lists
has_many :likes
has_many :liked_vendors, :through => :likes, :source => :vendor
end
class Like < ActiveRecord::Base
belongs_to :user
belongs_to :vendor
end
答案 0 :(得分:1)
这是因为您应该使用迭代变量来引用当前供应商(v,而不是@vendor)
<%= render 'layouts/like_button', :vendor => v %>
不要在视图中使用请求建模(Vendor.all),它不是MVC方式。 在控制器中定义它
@vendors = Vendor.all
然后在视图中引用它
@vendors.each do |v|
但它仍然无法正常工作,因为你提到的例子还没有准备好使用,因为它使用的是身份验证系统,但在该代码中没有完全呈现。你得到的错误也是由路由引起的,因为params [:id]是从url获得的。