[英]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.