Вызов метода модели из контроллера

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

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

 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

person Introvert Guy    schedule 24.05.2015    source источник


Ответы (1)


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

Вы предоставляете методу 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
person Kevin    schedule 24.05.2015
comment
Большое спасибо! Это помогло! :) - person Introvert Guy; 25.05.2015