繁体   English   中英

从控制器调用Model方法

[英]Calling a Model method from controller

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

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

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

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

@user.update_attributes(user_params)

上一行使用指定的user_params更新@user记录, @user在其中指定URL。

因此,当您像这样调用picture_from_url方法时,要么必须保存您的@user记录,要么:

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

User模型中将picture_from_url方法更改为上述方法(从技术上讲,您不必这样做,但它可能更易读),并将update操作更改为以下内容:

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

   ...
 end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM