我有两个型号:Image和Lightbox。为了关联这两个模型(has_many),我有第三个模型LightboxImages。
一个灯箱可以有多个图像,一个图像可以放在各种灯箱中。
动态创建灯箱(使用远程js),用户也可以动态地将图像添加到此灯箱。
我的第一个想法是简单地为LightboxImages Controller的create方法创建一个url,将Lightbox Id和Image Id作为参数传递。
然而,这种方法似乎很脆弱且不安全,因为用户可以轻松地模拟这种行为。
这种情况的最佳设计是什么,动态创建关系记录?
答案 0 :(得分:0)
你实际上有第四个模型 - 用户。无论如何,我假设你做了。
User has_many :lightboxes
Lightbox has_many :lightbox_items
Image has_many :lightbox_items
LightboxItem belongs_to :lightbox
LightboxItem belongs_to :image
Lightbox has_many :images, :through => :lightbox_item
Image has_many :lightboxes, :through => :lightbox_item
LightboxItem是您可能希望存储其他数据的位置,例如图像在特定灯箱中的位置。
关键是每个Lightbox都属于一个用户。通过这种方式,您可以将控制器中的所有AR调用范围限定为当前用户 - 从而防止他们修改其他灯箱。
因此,用户carlos拥有灯箱ID 1.用户phallstrom拥有灯箱ID 2。
在您的控制器中,您以某种方式将current_user
设置为之前过滤器中的当前用户。然后,例如在获取指定灯箱的操作中,您将执行以下操作:
@lightbox = current_user.lightboxes.find_by_id(params[:id].to_i)
这样做,如果current_user是carlos,并且params [:id]是2,则不会返回任何内容。
同样,对于所有其他CRUD操作,您也可以将其范围限定为current_user。