2015-05-24 4 views
0

У меня есть пользовательский вид, где я разрешаю пользователю загружать собственное изображение или разрешать ему импортировать изображение из своего профиля LinkedIn. My LinkedIn OAuth отлично работает и возвращает URL-адрес изображения, расположенного на связанных серверах. У меня есть метод picture_from_url в моей модели User, который вызывается UsersController в его методе обновления. Я устанавливаю URL-адрес переменной сеанса, а затем отправляю его методу модели в контроллере. Это, однако, не обновляет изображение для пользователя. У меня есть установка papertrail gem, чтобы он мог использовать изображение со своего компьютера и просто изменить его профиль.Вызов метода модели с контроллера

Мой метод Модель

def picture_from_url(url) 
    encoded_url = URI.encode(url.to_s) 
    avatar= URI.parse(encoded_url) 
end 

Мой контроллер вызовов

def update 
    @user = User.find(params[:id]) 
    @user.picture_from_url(session[:linkedin_picture]) 
    respond_to do |format| 
    if can?(current_user, @user) 
     if @user.update_attributes(user_params) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { render_success @user } 
     else 
     format.html { render action: 'edit' } 
     format.json { render_error @user } 
     end 
    else 
     format.html { render action: 'edit', status: :unprocessable_entity } 
     format.json { render_error @user } 
    end 
    end 
end 

ответ

0

Вы на самом деле не его сохранения (как вы сказали).

Вы предоставляете свой метод picture_from_url с URL-адресом, кодируете и разбираете его. Последнее, что вы делаете с этим, - установить avatar. Я предполагаю, что это атрибут вашей модели User. Однако вы его не спасаете.

Следующая строка в контроллере не сохраняет его либо:

@user.update_attributes(user_params) 

Эта строка обновляет свой @user запись с указанным user_params и URL не указан в ней.

Таким образом, вы должны либо сохранить @user записи при вызове picture_from_url метода, как это:

def picture_from_url(url) 
    encoded_url = URI.encode(url.to_s) 
    update_attributes avatar: URI.parse(encoded_url) 
end 

Или вы можете добавить отформатированные URL (которую можно извлечь из метода picture_from_url) к user_params хэш, который сохраняется при чем update_attributes называется в контроллере, как это:

def picture_from_url(url) 
    encoded_url = URI.encode(url.to_s) 
    URI.parse encoded_url 
end 

Изменение picture_from_url метод выше в вашей User модель (технически вы не должны делать это, но это, вероятно, более удобным для чтения) и ваш update действия на следующее:

def update 
    @user = User.find(params[:id]) 
    user_params.merge! avatar: @user.picture_from_url(session[:linkedin_picture]) 

    ... 
end 
+0

Большое спасибо! Это помогло! :) –

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