Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 自定义库,使其属于一个用户_Ruby On Rails_Carrierwave - Fatal编程技术网

Ruby on rails 自定义库,使其属于一个用户

Ruby on rails 自定义库,使其属于一个用户,ruby-on-rails,carrierwave,Ruby On Rails,Carrierwave,我正在使用CarrierWave,到目前为止,画廊对公众开放,没有所有权。我想进行设置,以便用户不必创建图库。唯一的选择应该是上传照片到他们的帐户,我想限制每个用户最多上传5张照片。所以,如果用户16登录,他们可以选择上传多达5张照片到他们的个人资料。一旦达到这个限制,如果用户试图上传更多的照片,应该说“上传的照片最多,删除以上传更多”。我不知道该怎么办 photo.rb型号: class Photo < ActiveRecord::Base attr_accessible :titl

我正在使用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
画廊管理员:

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
会更有意义,你不觉得吗?