用户更新功能不再有效但应该

时间:2014-02-13 01:54:39

标签: ruby-on-rails ruby-on-rails-4 carrierwave image-uploading

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

1 个答案:

答案 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因为@usernil,因此没有update方法。将User的正确实例分配给@user实例变量将解决此问题。

<强>更新

根据问题中引用的请求参数,表单将用户名作为 id 参数发布。为了解决此问题,您需要通过找到与User匹配的username的记录来检索params[:id]

def update
  User.find_by_username(params[:id])
end