Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 用户更新功能不再工作,但应该_Ruby On Rails_Ruby On Rails 4_Carrierwave_Image Uploading - Fatal编程技术网

Ruby on rails 用户更新功能不再工作,但应该

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

我安装了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

  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