删除'这个' Rails中Cart的对象4

时间:2015-12-31 16:43:29

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个购物车控制器(使用单个资源,因为不需要id),在show动作中可以有多个对象(本例中的图像),每个添加到购物篮中的图像都会列出,但作为用户我可能会我想在此时改变主意并删除图片。

我不确定我当前的实施是否会引起我的问​​题,但我正在寻找一种说法"删除此图片"。

这是我到目前为止所拥有的

class Image < ActiveRecord::Base
  # photo
end

create_table "images", force: :cascade do |t|
  t.string   "title"
  t.text     "description"
  t.string   "photo_file_name"
  t.string   "photo_content_type"
  t.integer  "photo_file_size"
  t.datetime "photo_updated_at"
  t.datetime "created_at",         null: false
  t.datetime "updated_at",         null: false
end

class Cart < ActiveRecord::Base
  # user_id, image_id
end

create_table "carts", force: :cascade do |t|
  t.integer  "image_id"
  t.integer  "user_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

将图片添加到购物车时,我通过带有Ajax的button_to

执行此操作
<%= button_to cart_path(image_id: params[:id], user_id: current_or_guest_user), method: :post, :remote => true %>

在购物车中查看图像时,我使用购物车的显示操作

class CartController < ApplicationController
  def show
    cart_ids = Cart.where(user_id: current_or_guest_user)
    image_ids = cart_ids.map(&:image_id)
    @cart_images = Image.where(id: image_ids)
  end
end

查看

<% @cart_images.each do |i| %>
  <%= button_to cart_path(id: # unsure here), method: :delete, :remote => true %>
<% end %>

如何获取我要删除的图像的相应购物车ID

Image has_many Carts这样的关系会在这里运作吗?或者实际上是另一种方式,所以一个购物车has_many图像,一旦我将图像添加到购物车有一个after_create动作,用购物车ID更新图像?还是完全错了?

1 个答案:

答案 0 :(得分:1)

由于图片没有对购物车的反向引用(外键位于购物车表中),最好以这种方式处理您的情况:

在您的控制器中:

# Get the cars for the current user that DO have an image associated
@carts_with_images = Cart.where(user_id: current_or_guest_user).where.not(image_id: nil)

然后在你看来:

<% @carts_with_images.each do |cart| %>
  <%= button_to cart_path(cart), method: :delete, remote: true %>
<% end %>

然后,您可以使用cart.image

轻松访问循环中购物车的图片