Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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 carrierwave没有';不保存文件也不更新模型_Ruby On Rails_File_Controller_Carrierwave_Uploader - Fatal编程技术网

Ruby on rails carrierwave没有';不保存文件也不更新模型

Ruby on rails carrierwave没有';不保存文件也不更新模型,ruby-on-rails,file,controller,carrierwave,uploader,Ruby On Rails,File,Controller,Carrierwave,Uploader,嗨,我在rails api中使用carrierwave上传用户头像。。。在我的控制器中,我有一个方法update_avatar,它用给定的文件更新user.avatar_uri 我查阅了carrierwave的文档并遵循了每一步,但它不起作用。它不保存文件,也不保存模型本身 这是控制器用户\u controller.rb def update_avatar parameters = Hash.new user = User.find_by(id: params[:user

嗨,我在rails api中使用carrierwave上传用户头像。。。在我的控制器中,我有一个方法update_avatar,它用给定的文件更新user.avatar_uri

我查阅了carrierwave的文档并遵循了每一步,但它不起作用。它不保存文件,也不保存模型本身

这是控制器用户\u controller.rb

    def update_avatar
    parameters = Hash.new
    user = User.find_by(id: params[:user_id])
    if user
      #p("----user.avatar_uri.url before user.avatar_uri = params[:avatar] : "+user.avatar_uri.url)

      user.is_used_fb_avatar=false
      p("----user.avatar_uri.url before update: "+ user.avatar_uri.url)
      User.update(params[:user_id], :avatar_uri => params[:avatar])
      p("----user.avatar_uri.url after update: "+user.avatar_uri.url)


      if  user.avatar_uri

        parameters["success"]=true
        parameters["avatar_uri"]=user.avatar_uri.url
      else
        parameters["success"]=false
        parameters["error"]="Couldn't update user check the file used"
      end
    else
      parameters["success"]=false
      parameters["error"]="Couldn't find user"
    end
    render :json => parameters.to_json
  end
这是model user.rb

     class User < ApplicationRecord
      # Include default devise modules. Others available are:
      # :confirmable, :lockable, :timeoutable and :omniauthable
      mount_uploader :avatar_uri, AvatarUploader
      attr_accessor :login
      has_one :role, dependent: :destroy
      has_many :posts, dependent: :destroy
      has_many :likes, dependent: :destroy
      has_many :shares, dependent: :destroy
      has_many :comments, dependent: :destroy
      has_many :messages
      has_many :notifications, dependent: :destroy
      has_many :follows, class_name: "Follow", foreign_key: "follower_id", dependent: :destroy
      has_many :tokens
      has_and_belongs_to_many :conversations
    ...
end
试试这个:

def filename
  "avatar-#{secure_token}.jpg" if original_filename.present?
end

protected

def secure_token
  var = :"@#{mounted_as}_secure_token"
  model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
end

我总是初始化该字段,因此不确定这是否是问题所在,请尝试这样做
user.avatar\u uri=AvatarUploader.new user.avatar\u uri=params[:avatar]user.save
然后在上传程序上,def filename,将
SecureRandom.urlsafe\u base64(16).放到+File.extname(原始文件名)。如果原始文件名在print语句之后,放到\s?它实际上工作了,但没有预期的效果:它保存了文件,但用另一个名称更新了user.avatar\u uri。。。下面是日志中的几行:
SQL(84.0ms)UPDATE“users”设置“avatar_uri”=$1,“updated_在”=$2,其中“users”。“id”=$3[[“avatar_uri”,“NghyuZZ6vvdtiWFQrO6m4w.jpg”],[“updated_at”,2017-06-30 20:22:22 UTC],“id”,47]]
-->已被使用\u fb\u头像未被调用--
文件名=>mcXKz1hV6vfkMid23l4ixw.jpg
(21.7ms)提交“----更新后的user.avatar\u uri.url:/user/image/8tmtcbhppibafelwiito07q.jpg”
SecureRandom.urlsafe\u base64(16).到文件名+
文件名(原始文件名)。如果原始文件名放入(“——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————,它应该返回名称而不是puts语句?因此,如果您将第一个securerandom…分配给一个变量,然后放入该变量,最后返回该变量->>如果原始文件名尝试了它…仍然相同..我甚至尝试完全删除puts:
def filename if model.is_used_fb_avatar original_filename#puts(“-----------是否使用了\u fb\u头像被称为--”)否则新的\u文件\u名称=SecureRandom.urlsafe\u base64(16).到\u s+文件.extname(原始\u文件名).到\u新的\u文件\u名称如果原始的\u文件名结束
问题是由于某种原因,它在更新后另一次被调用:
SQL(0.8ms)更新“用户”集阿凡达uri“=$1”,更新时间“=$2,其中“用户”。“id”=$3[[“阿凡达uri”、“\u7ad618in4cyi-IBTtznbg.jpg”],[“更新时间”,2017-06-30 21:04:57 UTC],“id”,47]------正在使用中\uFB阿凡达未被调用----filename=>twmswb8namlymwfdwzqdw.jpg(37.5ms)提交”------更新后的user.avatar\wbu.url:/user/image/twmwwzwwwqdwwwwqdw.url“在940毫秒内完成200 OK(视图:78.7毫秒|活动记录:550.1毫秒)
这就是为什么它与保存的文件不同的原因name@AhmedFnayou我添加了一个我的工作上传器的样本,你能试试吗?也许它只是原始的文件名.present?那不见了?是的。。。你的代码运行得很好。。。最后我只试过了。礼物?一开始,但没用。。所以我只是添加了你的secure_token方法,并像你一样使用它。。。成功了!!谢谢你,先生:)
Started PUT "/api/update-user-avatar.json" for 127.0.0.1 at 2017-06-30 21:10:43 +0200
Processing by Api::UsersController#update_avatar as JSON
  Parameters: {"user_id"=>"47", "avatar"=>#<ActionDispatch::Http::UploadedFile:0x007f852d2c54e8 @tempfile=#<Tempfile:/var/folders/k7/2bnc1fxs1r164gf831dn5l140000gn/T/RackMultipart20170630-1261-1viplk8.jpg>, @original_filename="batman.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"avatar\"; filename=\"batman.jpg\"\r\nContent-Type: image/jpeg\r\n">}
  User Load (0.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 47], ["LIMIT", 1]]
"----user.avatar_uri.url before update: /user/image/wlOHg5N0K5aq5hJGFlM6XA.png"
  CACHE (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 47], ["LIMIT", 1]]
   (0.3ms)  BEGIN
  User Exists (0.5ms)  SELECT  1 AS one FROM "users" WHERE "users"."username" = $1 AND ("users"."id" != $2) LIMIT $3  [["username", "John"], ["id", 47], ["LIMIT", 1]]
--------- is_used_fb_avatar is not called ----
filename => jDZ48CtHI5a9L0qGcKdEWQ.jpg
  SQL (37.7ms)  UPDATE "users" SET "updated_at" = $1, "avatar_uri" = $2 WHERE "users"."id" = $3  [["updated_at", 2017-06-30 19:10:45 UTC], ["avatar_uri", "wlOHg5N0K5aq5hJGFlM6XA.png"], ["id", 47]]
--------- is_used_fb_avatar is not called ----
filename => njeFYobP6erVu9uYunmFhw.jpg
   (134.3ms)  COMMIT
"----user.avatar_uri.url after update: /user/image/wlOHg5N0K5aq5hJGFlM6XA.png"
Completed 200 OK in 683ms (Views: 136.7ms | ActiveRecord: 222.4ms)
def filename
    if model.is_used_fb_avatar
      original_filename
      #puts ("--------- is_used_fb_avatar is called ----")
    else
      "avatar-#{secure_token}.jpg" if original_filename.present?
    end
  end

  protected

  def secure_token
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
  end
def filename
  "avatar-#{secure_token}.jpg" if original_filename.present?
end

protected

def secure_token
  var = :"@#{mounted_as}_secure_token"
  model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
end