我安装了Carrierwave并按照说明启用它,以便用户可以上传图像/头像。我的avatar_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
我将图片标记添加到网站的用户编辑部分(_form.html.erb
),因为它是用户的一部分。
<%= image_tag(@user.avatar_url) if @user.avatar? %>
<p><%= f.file_field :avatar %></p>
<%= f.hidden_field :avatar_cache %>
和show.html.erb
:
<%= avatar_tag user.avatar_url(:thumb) if @user.avatar? %>
我的users_controller.rb
更新功能我没有做太多改动。
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
并且在此,user_params
似乎没问题。
def user_params
params.require(:user).permit(:username, :email, :full_name, :password, :password_confirmation, :avatar)
end
当我尝试使用编辑页面更新用户(即上传文件)时,它会给我一个错误
undefined method `update' for nil:NilClass
并指向users_controller文件的if @user.update
部分。它似乎也以"id"=>"username"
作为参数。我使用routes.rb
文件
get "/:username", to: "users#show", as: "username"
但是当我点击更新用户按钮时,它会重定向回/users/username
。我不确定这是否是由此导致的,或者我是否未正确实施头像上传。我觉得我在这里缺少一些简单的东西。
编辑:我的routes.rb
文件如下所示
root'home #index'
get "users/new"
get "/about" => "static_pages#about"
get "/contact" => "static_pages#contact"
get "/signedout" => "sessions#signout"
post "login" => "sessions#login"
resources :posts
resources :users
resources :sessions, only: [:new, :login, :signout]
match '/signin', to: 'sessions#login', via: 'get'
match '/signup', to: 'users#new', via: 'get'
match '/signedout', to: 'sessions#signout', via: 'delete'
get "/:username", to: "users#show", as: "username"
它还显示以下请求参数:
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"}
答案 0 :(得分:1)
您需要在User
控制器操作中定义users#update
的实例:
# 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
按原样,您的代码正在抛出undefined method 'update' for nil:NilClass
因为@user
为nil
,因此没有update
方法。将User
的正确实例分配给@user
实例变量将解决此问题。
<强>更新强>:
根据问题中引用的请求参数,表单将用户名作为 id 参数发布。为了解决此问题,您需要通过找到与User
匹配的username
的记录来检索params[:id]
:
def update
User.find_by_username(params[:id])
end