【问题标题】:User update function no longer works but should用户更新功能不再有效,但应该
【发布时间】:2014-03-11 17:01:23
【问题描述】:

我安装了 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"=&gt;"username" 作为参数。我有一个使用我的 routes.rb 文件的虚 URL

get "/:username", to: "users#show", as: "username"

但是当我单击更新用户按钮时,它会重定向回/users/username。我不确定这是导致它还是我没有正确实现头像上传。我觉得我在这里遗漏了一些简单的东西。

编辑:我的routes.rb 文件如下所示 根'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"}

【问题讨论】:

  • 如果您使用的是包罗万象的通配符路由,则需要在 users#show 操作中进行一些广泛的异常处理。只是一个观察 - 你可能已经这样做了......
  • 我对此完全陌生,肯定有点过头了。你能详细说明一下吗?
  • 你在这个问题上有很多东西要处理——我宁愿解决手头的问题。如果您想了解有关异常处理的更多信息,我建议您将其发布在另一个问题中。

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


【解决方案1】:

您需要在 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

按原样,您的代码正在抛出undefined method 'update' for nil:NilClass,因为@usernil,因此没有update 方法。将User 的正确实例分配给@user 实例变量将解决此问题。

更新

根据问题中引用的请求参数,表单将 username 作为 id 参数发布。为了处理这个问题,您需要通过查找与username 匹配params[:id] 的记录来检索User

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

【讨论】:

  • 好的,这是我想的答案之一。如果我重载它以更符合@user = User.find_by_username(params[:username]) 的路线,我会改用它,对吗?
  • 即使我把它扔进去了,我仍然遇到同样的错误。
  • 请用routes.rb的内容更新您的问题。
  • 实际上,因为这是update 操作(而不是show 操作),您仍然可能通过User.find(params[:id]) 访问正确的User 实例。到目前为止,您尝试过吗?
  • 当我放入该行而不是更新行时,它给出了一个错误。
猜你喜欢
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多