javascript - Rails ajax 'like' 按钮迭代时

标签 javascript ruby-on-rails ajax

我有一个 vendor 列表,我正在对其进行迭代,如您在下面的 View 中看到的那样。我正在尝试为每个 vendor 实现“最喜欢”或“喜欢”按钮。我在让它工作时遇到一些麻烦。这是我的观点:

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>

我的 Controller :

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 的 vendor ” 因此,不知何故, vendor 一词作为 ID 传入,但我不知道在哪里或如何修复它。我对 ajax 或 javascript 没有做过太多的工作,所以我对此有点陌生。我一直在尝试遵循此示例应用程序的功能:https://github.com/sergeylukin/soquestion6482354/blob/master/app/views/products/show.html.erb

请帮忙?提前致谢!

编辑注释

我已更新我的代码以反射(reflect)我所做的更改。我不得不将它与表单混合在一起,因为在迭代时我无法让 form_for 工作。我目前可以通过 ajax 使用正确的参数提交 likes,但我仍然无法提交 unlikes。我也没有看到我的页面更新后附加了新的喜欢。正如我所说,我对 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

最佳答案

这是因为你应该使用迭代变量来引用当前 vendor (v,而不是@vendor)

<%= render 'layouts/like_button', :vendor => v %>

不要在 View (Vendor.all) 中使用请求进行建模,这不是 MVC 方式。 在您的 Controller 中定义它

@vendors = Vendor.all

然后在 View 中引用它

@vendors.each do |v|

但它仍然无法工作,例如您提到的示例还不能立即使用,因为它使用身份验证系统,而该系统未在该代码中完全呈现。您遇到的错误也是由路由引起的,因为 params[:id] 是从 url 获取的。

关于javascript - Rails ajax 'like' 按钮迭代时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18602445/

相关文章:

javascript - 内容类型 image/png ajax

javascript - 在 Typescript 中导入 CouchDB Nano 6.4 打字

ruby-on-rails - rails 中单一形式的多个 child

ruby-on-rails - 如何用\n字符替换新行

ruby-on-rails - rails form helper 空验证

javascript - 使用 get() 加载页面之前加载图像

Jquery Ajax加载方法

javascript - 如何从 jquery 中的下拉列表中删除或隐藏重复值

javascript - 只想在 wordpress 中使用 jQuery 在主页上加载弹出窗口

javascript - 如何检查是否选择了任何 li?