Ruby on rails 用户更新功能不再工作,但应该
我安装了Carrierwave并按照说明操作,这样用户就可以上传图像/化身。我的Ruby on rails 用户更新功能不再工作,但应该,ruby-on-rails,ruby-on-rails-4,carrierwave,image-uploading,Ruby On Rails,Ruby On Rails 4,Carrierwave,Image Uploading,我安装了Carrierwave并按照说明操作,这样用户就可以上传图像/化身。我的avatar\u uploader.rb看起来很正常,我没有做任何改变 class AvatarUploader < CarrierWave::Uploader::Base storage :file def store_dir "/images/" end version :thumb do process :scale => [50, 50] end d
avatar\u uploader.rb
看起来很正常,我没有做任何改变
class AvatarUploader < CarrierWave::Uploader::Base
storage :file
def store_dir
"/images/"
end
version :thumb do
process :scale => [50, 50]
end
def extension_white_list
%w(jpg jpeg png)
end
end
并转到show.html.erb
:
<%= avatar_tag user.avatar_url(:thumb) if @user.avatar? %>
在这种情况下,用户参数
似乎没有问题
def user_params
params.require(:user).permit(:username, :email, :full_name, :password, :password_confirmation, :avatar)
end
当我试图用编辑页面更新用户(即上传文件)时,它会给我一个错误
undefined method `update' for nil:NilClass
并指向my users\u控制器文件的if@user.update
部分。它似乎还将“id”=>“username”
作为一个参数。我有一个使用我的routes.rb
文件的虚荣URL
get”/:username“,to:“users#show”,as:“username”
但当我单击“更新用户”按钮时,它会重定向回/users/username
。我不确定这是不是原因,或者我没有正确地实现化身上传。我觉得我错过了一些简单的东西
编辑:我的routes.rb
文件如下所示
根“home#index”
它还显示以下请求参数:
Request
Parameters:
{"utf8"=>"✓",
"_method"=>"patch",
"authenticity_token"=>"C2bHFQkNIjZ090wZhN4bLTJAl7Jqw4ZmRwyo3cmOQ5s=",
"user"=>{"username"=>"jsamson",
"email"=>"me@jsamson.com",
"full_name"=>"Jesse Samson",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"avatar_cache"=>""},
"commit"=>"Update User",
"id"=>"jsamson"}
您需要在
users\update
控制器操作中定义User
的实例:
# app/controllers/users_controller.rb
def update
@user = User.find(params[:id]) # Insert this as the first line of the method
# remainder of code
end
实际上,您的代码正在为nil:NilClass抛出一个未定义的方法“update”,因为@user
是nil
,因此没有update
方法。将User
的正确实例分配给@User
实例变量将解决此问题
更新:
根据问题中引用的请求参数,表单将发布用户名作为id参数。为了处理此问题,您需要通过查找与参数[:id]
匹配的用户名的记录来检索用户
:
def update
User.find_by_username(params[:id])
end
好吧,这是我想的答案之一。如果我重载了它,使其更符合@user=user.find_by_username(params[:username])
,我会使用它,对吗?即使我把它扔进去了,我仍然会收到相同的错误。请用routes.rb
的内容更新你的问题。实际上,因为这是更新
操作(而不是show
操作),您仍然可以通过User.find(params[:id])访问正确的User
实例
。到目前为止您是否尝试过此操作?当我将其放在更新行中而不是放在更新行中时,该行会出现错误。如果您使用的是全覆盖通配符路由,您需要在用户#show
操作中执行一些广泛的异常处理。只是一个观察–您可能已经在执行此操作了…我对此完全陌生,肯定有点你能详细说明一下吗?在这个问题上你有很多东西要做-我宁愿解决手头的问题。如果你想了解更多关于异常处理的信息,我建议你在另一个问题中发布它。
Request
Parameters:
{"utf8"=>"✓",
"_method"=>"patch",
"authenticity_token"=>"C2bHFQkNIjZ090wZhN4bLTJAl7Jqw4ZmRwyo3cmOQ5s=",
"user"=>{"username"=>"jsamson",
"email"=>"me@jsamson.com",
"full_name"=>"Jesse Samson",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"avatar_cache"=>""},
"commit"=>"Update User",
"id"=>"jsamson"}
# app/controllers/users_controller.rb
def update
@user = User.find(params[:id]) # Insert this as the first line of the method
# remainder of code
end
def update
User.find_by_username(params[:id])
end