2013-04-03 1 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 

сообщение об ошибке, вероятно, следует перейти в файл локали.

Создание галереи автоматически для каждого пользователя

Чтобы сделать это, убедитесь, что модель Gallery имеет belong_to ассоциацию с пользователем. Затем создайте галерею в функции обратного вызова в модели пользователя:

# models/user.rb 
after_create :setup_gallery 

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

Общие замечания

Когда вы определяете has_many отношения, вы должны использовать множественные имена, как has_many :users или has_many :galleries.

+0

Большое спасибо за демонстрацию примеров и объяснение очень хорошо, чтобы я мог учиться! Это работает отлично. Хотя на стороне записки, я создал свою собственную авторизацию/аутентификацию. Не использовать cancan. – pwz2000

+0

Также в чем разница: используется сингулярное vs.множественное число для has_many, так как я использовал единственное число без каких-либо проблем? – pwz2000

+1

Возможно, он по-прежнему работает (в некоторых случаях), но код будет нестандартным и будет иметь меньшее значение для вас или других разработчиков в конечном итоге и может разорвать некоторые функции в Rails. Пример: в вашем коде '@ photo.gallery' вернет список галерей. '@ photo.galleries' будет иметь больше смысла, не так ли? – Jesper

Смежные вопросы