2013-04-03 54 views
0

我正在使用CarrierWave,截至目前该画廊向公众开放,没有所有权。我想设置,以便用户不必创建一个图库。唯一的选择应该是上传照片到他们的帐户,我想限制每个用户照片上传到5最大。因此,如果用户16登录,他们可以选择上传5张照片到他们的个人资料。一旦达到这个限制,如果用户尝试上传更多,它应该说“上传的最大照片数量,删除上传更多”。我不确定如何解决这个问题。自定义画廊,以便它属于一个用户

photo.rb模型:

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 

相片控制器:

类PhotosController < ApplicationController中

def new 
    @photo = Photo.new(:gallery_id => params[:gallery_id]) 
    end 

    def create 
    @photo = Photo.new(params[:photo]) 
    if @photo.save 
     flash[:notice] = "Successfully created photos." 
     redirect_to @photo.gallery 
    else 
     render :action => 'new' 
    end 
end 

    def edit 
    @photo = Photo.find(params[:id]) 
    end 

    def update 
    @photo = Photo.find(params[:id]) 
    if @photo.update_attributes(paramas[:photo]) 
     flash[:notice] = "Successfully updated photo." 
     redirect_to @photo.gallery 
    else 
     render :action => 'edit' 
    end 
    end 

    def destroy 
    @photo = Photo.find(params[:id]) 
    @photo.destroy 
    flash[:notice] = "Successfully destroyed photo." 
    redirect_to @photo.gallery 
    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 

回答

1

限制用户访问

要限制用户访问某些模型,我会使用类似CanCan的东西。

这将让你做的东西是这样的:

## 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 

错误消息或许应该进入一个区域设置文件。

为每个用户

要做到这一点自动创建画廊,确保画廊模式有一个belong_to协会用户。然后在用户模式的回调创建画廊:

# models/user.rb 
after_create :setup_gallery 

private 
def setup_gallery 
    Gallery.create(user: self) 
end 

秘书长注意到

当你定义has_many关系,你应该用复数的名称,如has_many :usershas_many :galleries

+0

非常感谢您展示例子和解释得非常好,所以我可以学习!这工作完美。尽管在附注中,我创建了自己的授权/认证。不使用康康。 – pwz2000 2013-04-04 14:44:19

+0

还有什么区别是使用单数vs.has_many的复数因为我使用单数而没有发生任何问题? – pwz2000 2013-04-04 14:52:57

+1

它可能仍然有效(在某些情况下),但从长远来看,代码将是非标准的,对您或其他开发人员意义不大,并且可能会在Rails中破坏某些函数。例如:在你的代码中,'@ photo.gallery'将返回一个画廊列表。 '@ photo.galleries'会变得更有意义,你不觉得吗? – Jesper 2013-04-05 09:52:41