String的未定义方法'original_filename'?

时间:2014-04-04 20:39:15

标签: ruby-on-rails

我正在通过我的ios应用程序向我的rails服务器发送base64编码的图像字符串。我正在尝试将图像带入rails并将其保存到数据库中。该文件是header_img,我将其添加到我的模型组中。

我一直关注这个tutorial

我得到一个未定义的方法错误'original_filename'但是因为我不熟悉这个过程我正在努力解决它我做错了。

根据heroku日志,在两行上发生错误。这些行是:

创建方法: upload_header_img(header_img)

Upload_header_img方法: extension = File.extname(header_img_io.original_filename)

这是我的完整代码:

groups_controller底部的私有函数:

 private  
   def upload_header_img(header_img_io)           
      # upload to the exact location account id and extension
      extension = File.extname(header_img_io.original_filename)

      # rails take public as root directory
      # under the root directory (public)
      # there are a icon directory
      header_img_url = "/header_img/"+@group.id.to_s + extension

      # open in binary mode
      File.open("public"+icon_url,'wb') do |file|
      file.write(header_img_io.read)
      end

      @group.update_attribute(:header_img_url, header_img_url)
   end

我的创建组功能在groups_controller中:

  def create
      @group = Group.new(params[:group])
      @group.owner_id = @user.id
      header_img = @group.header_img || @group.decode_header_img_image_data
      if header_img.present?
        upload_header_img(header_img)
      end

   respond_to do |format|
      if @group.save
        @membership = @user.memberships.build(group_id: @group.id)
        @membership.save
        format.html { redirect_to @group, notice: 'Group was successfully created.' }
        format.json { render json: @group, status: :created, location: @group }
      else
        format.html { render action: "new" }
        format.json { render json: @group.errors, status: :unprocessable_entity }
      end
    end
  end

小组模特:

class Group < ActiveRecord::Base

      attr_accessible :description, :name, :user_id, :private, :header_img_url, :header_img_data, :header_img
      attr_accessor :header_img_data, :header_img
      has_many :posts
      has_many :memberships 
      has_many :users, :through => :memberships
      acts_as_followable 

      def decode_header_img_data
      # if the icon_image_data is set
      # decode it and handle by controller method

        if self.header_img_data.present?
          data = StringIO.new(Base64.decode64(self.header_img_data))
          data.class.class_eval {attr_accessor :original_filename, :content_type}
          data.original_filename = self.id.to_s+".png"
          data.content_type = "image/png"

          return data
        end
      end
    end

这是我的heroku日志(不包括base64字符串数据,因为它很大):

2014-04-04T21:30:40.892198+00:00 app[web.1]: Completed 500 Internal Server Error in 31.4ms
2014-04-04T21:30:40.922539+00:00 app[web.1]: 
2014-04-04T21:30:40.922539+00:00 app[web.1]: NoMethodError (undefined method `original_filename' for #<String:0x007fa84e4c8648>):
2014-04-04T21:30:40.922539+00:00 app[web.1]:   app/controllers/groups_controller.rb:91:in `upload_header_img'
2014-04-04T21:30:40.922539+00:00 app[web.1]:   app/controllers/groups_controller.rb:44:in `create'

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

问题在于您的header_img_url变量:

header_img_url = "/header_img/"+@group.id.to_s + extension

      # open in binary mode
      File.open("public"+icon_url,'wb') do |file|
      file.write(header_img_io.read)
      end

您已将变量从icon_url更改为header_img_url,但错过了更新此代码段:

File.open("public"+icon_url,'wb') do |file|

将其更改为header_img_url,您就会变得更好。

同样移动此代码:

header_img = @group.header_img || @group.decode_header_img_data
    if header_img.present?
      upload_header_img(header_img)
    end

在您的创建操作中@group.save之后。

由于您的@group对象尚未保存在数据库中,@ group.id将为nil,当您在其上调用to_s时,它将返回&#34;&#34;。现在,您的header_img_url设置为&#34; / header_img / public /&#34;,这是一个目录,您最终会读取目录而不是文件。