我正在通过我的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'
非常感谢任何帮助。谢谢。
答案 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;,这是一个目录,您最终会读取目录而不是文件。