2014-02-20 3 views
0

Я использую драгоценный камень CarrierWave, и у меня есть столбец avatar_id в таблице Users и таблице Photos, в которой есть столбец id и user_id. Есть ли способ настроить так, чтобы первая фотография, загруженная пользователем, была назначена их avatar_id?Как сделать первый загруженный фото аватара пользователя

Например, я зарегистрироваться в качестве пользователя 56. Я загрузить свою первую фотографию (ID 89) и мои avatar_id обновления столбца с идентификатором 89.

Фотографии Контроллер:

def new 
    @photo = Photo.new 
    end 

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



    def resize(width, height, gravity = 'Center') 
    manipulate! do |img| 
     img.combine_options do |cmd| 
     cmd.resize "#{width}" 
     if img[:width] < img[:height] 
      cmd.gravity gravity 
      cmd.background "rgba(255,255,255,0.0)" 
      cmd.extent "#{width}x#{height}" 
     end 
     end 
     img = yield(img) if block_given? 
     img 
    end 
    end 
    def edit 
    @photo = Photo.find(params[:id]) 
    end 

    def update 
    @photo = Photo.find(params[:id]) 
    if @photo.update_attributes(params[: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 

    def avatar 
    if current_user.update_attribute(:avatar_id, params[:id]) 
     flash[:notice] = "Successfully made Avatar." 
     else 
      flash[:notice] = "Avatar failed" 
     end 
     redirect_to(current_user) 
     end 
end 

ответ

1

Это начинает получать более сложной, чем вы, вероятно, хотите сбросить в контроллерах (начать смотреть на service objects помочь), но вот то, что вы хотите сделать:

# photo created above 
photo.user = current_user 
if photo.save 
    if current_user.photos.size <= 1 
    current_user.avatar = photo 
    end 
    flash[:success] = '...' 
    # ... 
end 

другой подход состоит в том, чтобы просто проверить, установлен ли аватар, что, вероятно, более уместно, но я хотел показать вам, о чем вы сначала просили.

current_user.avatar = photo if current_user.avatar.blank? 
+0

Вы определенно должны принять второй подход. Во-первых, это просто уродливый ... –

+0

@MichaelSzyndel Второй подход отличается только двумя способами: во-первых, это условие находится в одной строке, а во-вторых, оно проверяет 'avatar.blank?' Vs '.photos.size' , Способ очистки этого кода - это то, что я рекомендовал в начале своего ответа. ;) – coreyward

+0

Проверка размера - вот почему я считаю первое решение уродливым - для этого требуется дополнительный SQL-запрос. Насколько я понимаю вопрос OP, если нет аватара, установите первую фотографию как аватар. Но мы будем выполнять это только при сохранении, ergo, во время первой загрузки. Если вы минимизируете множество возможных переменных, вы получаете второе решение! :) –

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