从控制器调用Model方法

时间:2015-05-24 03:11:54

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个用户视图,我允许用户上传自己的图片或允许他从他的LinkedIn个人资料中导入图片。我的LinkedIn OAuth工作正常,并返回位于linkedin服务器上的图像的URL。我的User模型中有一个picture_from_url方法,由UsersController在其更新方法中调用。我将url设置为sessions变量,然后将其发送到控制器中的model方法。但是,这不是为用户更新图像。我有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

1 个答案:

答案 0 :(得分:0)

你实际上没有保存它(如你所说)。

您为picture_from_url方法提供了一个URL,对其进行编码和解析。你用它做的最后一件事是将它设置为avatar。我猜测这是User模型的属性。你虽然没有保存它。

控制器中的以下行也不保存:

@user.update_attributes(user_params)

上述行正在使用指定的@user更新您的user_params记录,并且未在其中指定网址。

因此,当您像这样调用@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