Ruby on rails 自定义库,使其属于一个用户
我正在使用CarrierWave,到目前为止,画廊对公众开放,没有所有权。我想进行设置,以便用户不必创建图库。唯一的选择应该是上传照片到他们的帐户,我想限制每个用户最多上传5张照片。所以,如果用户16登录,他们可以选择上传多达5张照片到他们的个人资料。一旦达到这个限制,如果用户试图上传更多的照片,应该说“上传的照片最多,删除以上传更多”。我不知道该怎么办 photo.rb型号:Ruby on rails 自定义库,使其属于一个用户,ruby-on-rails,carrierwave,Ruby On Rails,Carrierwave,我正在使用CarrierWave,到目前为止,画廊对公众开放,没有所有权。我想进行设置,以便用户不必创建图库。唯一的选择应该是上传照片到他们的帐户,我想限制每个用户最多上传5张照片。所以,如果用户16登录,他们可以选择上传多达5张照片到他们的个人资料。一旦达到这个限制,如果用户试图上传更多的照片,应该说“上传的照片最多,删除以上传更多”。我不知道该怎么办 photo.rb型号: class Photo < ActiveRecord::Base attr_accessible :titl
class Photo < ActiveRecord::Base
attr_accessible :title, :body, :gallery_id, :name, :image, :remote_image_url
has_many :user, :through => :gallery
has_many :gallery
mount_uploader :image, ImageUploader
LIMIT = 5
validate do |record|
record.validate_photo_quota
end
def validate_photo_quota
return unless self.user
if self.gallery.user(:reload).count >= LIMIT
errors.add(:base, :exceeded_quota)
end
end
end
画廊管理员:
class GalleriesController < ApplicationController
def index
@galleries = Gallery.all
end
def show
@gallery = Gallery.find(params[:id])
end
def new
@gallery = Gallery.new
end
def create
@gallery = Gallery.new(params[:gallery])
if @gallery.save
flash[:notice] = "Successfully created gallery."
redirect_to @gallery
else
render :action => 'new'
end
end
def edit
@gallery = Gallery.find(params[:id])
end
def update
@gallery = Gallery.find(params[:id])
if @gallery.update_attributes(params[:gallery])
flash[:notice] = "Successfully updated gallery."
redirect_to gallery_url
else
render :action => 'edit'
end
end
def destroy
@gallery = Gallery.find(params[:id])
@gallery.destroy
flash[:notice] = "Successfully destroy gallery."
redirect_to galleries_url
end
end
class GalleriesController“新建”
结束
结束
定义编辑
@gallery=gallery.find(参数[:id])
结束
def更新
@gallery=gallery.find(参数[:id])
如果@gallery.update_属性(参数[:gallery])
flash[:notice]=“已成功更新库。”
将\u重定向到库\u url
其他的
呈现:操作=>“编辑”
结束
结束
def销毁
@gallery=gallery.find(参数[:id])
@毁灭
flash[:注意]=“已成功销毁库。”
将\u重定向到库\u url
结束
结束
限制用户访问
为了限制用户对某些模型的访问,我将使用类似的方法
它可以让你做这样的事情:
## ability.rb
# Allow user to CRUD pictures belonging to own gallery
can :manage, Picture, gallery: {user: user}
# picture_controller.rb
# assuming a nested route, e.g. galleries/1/pictures
load_and_authorize_resource :gallery
load_and_authorize_resource :picture, through: :gallery
在控制器中,您可以执行以下操作:
## ability.rb
# Allow user to CRUD pictures belonging to own gallery
can :manage, Picture, gallery: {user: user}
# picture_controller.rb
# assuming a nested route, e.g. galleries/1/pictures
load_and_authorize_resource :gallery
load_and_authorize_resource :picture, through: :gallery
这将确保每个用户只看到自己的图片
限制图库中的图片数量
我认为你的验证方法是可以的
我想把它简化如下:
validate :quota
private
def quota
return unless user
if gallery.pictures.count > 4
errors[:base] << "Maximum photos uploaded, delete to upload more"
end
end
一般说明
当您定义您的
has\u many
关系时,您应该使用复数名称,如has\u many:users
或has\u many:gallery
非常感谢您展示示例并进行了很好的解释,以便我可以学习!这很好用。尽管是旁注,我还是创建了自己的授权/身份验证。不使用cancan。还有什么区别是使用单数还是复数?自从我使用单数之后,有多少次没有出现任何问题?它可能仍然可以工作(在某些情况下),但代码将是非标准的,从长远来看对您或其他开发人员来说意义不大,并且可能会破坏Rails中的某些功能。例如:在您的代码中,@photo.gallery
将返回一个库列表@photo.galleries
会更有意义,你不觉得吗?