我有一个购物车控制器(使用单个资源,因为不需要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更新图像?还是完全错了?
答案 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