我會繼續向前道歉,因爲我是紅寶石和鐵軌的新手,我無法爲我的生活弄清楚如何在我的項目中使用哈希實現。該項目是一個簡單的圖像主機。我已經使用Base58來編碼sql ID,然後在控制器中解碼它。不過,我想讓URL更加隨意,因此轉而使用hashids。我如何在軌道上實現紅寶石哈希
我已經放在hashids.rb文件在我的lib目錄從這裏:https://github.com/peterhellberg/hashids.rb
現在的一些混亂,從這裏開始。我是否需要通過
hashids = Hashids.new("mysalt")
我發現這個職位(http://zogovic.com/post/75234760043/youtube-like-ids-for-your-activerecord-models),這使我相信我可以把它變成一個初始使用hashids.encode和hashids.decode每一頁上初始化hashids這樣做,我不過之後我仍然得到NameError(爲的ImageManager未定義的局部變量或方法`hashids':類)
所以在我ImageManager.rb類我有
require 'hashids'
class ImageManager
class << self
def save_image(imgpath, name)
mime = %x(/usr/bin/exiftool -MIMEType #{imgpath})[34..-1].rstrip
if mime.nil? || !VALID_MIME.include?(mime)
return { status: 'failure', message: "#{name} uses an invalid format." }
end
hash = Digest::MD5.file(imgpath).hexdigest
image = Image.find_by_imghash(hash)
if image.nil?
image = Image.new
image.mimetype = mime
image.imghash = hash
unless image.save!
return { status: 'failure', message: "Failed to save #{name}." }
end
unless File.directory?(Rails.root.join('uploads'))
Dir.mkdir(Rails.root.join('uploads'))
end
#File.open(Rails.root.join('uploads', "#{Base58.encode(image.id)}.png"), 'wb') { |f| f.write(File.open(imgpath, 'rb').read) }
File.open(Rails.root.join('uploads', "#{hashids.encode(image.id)}.png"), 'wb') { |f| f.write(File.open(imgpath, 'rb').read) }
end
link = ImageLink.new
link.image = image
link.save
#return { status: 'success', message: Base58.encode(link.id) }
return { status: 'success', message: hashids.encode(link.id) }
end
private
VALID_MIME = %w(image/png image/jpeg image/gif)
end
end
在我控制我有:
require 'hashids'
class MainController < ApplicationController
MAX_FILE_SIZE = 10 * 1024 * 1024
MAX_CACHE_SIZE = 128 * 1024 * 1024
@links = Hash.new
@files = Hash.new
@tstamps = Hash.new
@sizes = Hash.new
@cache_size = 0
class << self
attr_accessor :links
attr_accessor :files
attr_accessor :tstamps
attr_accessor :sizes
attr_accessor :cache_size
attr_accessor :hashids
end
def index
end
def transparency
end
def image
#@imglist = params[:id].split(',').map{ |id| ImageLink.find(Base58.decode(id)) }
@imglist = params[:id].split(',').map{ |id| ImageLink.find(hashids.decode(id)) }
end
def image_direct
#linkid = Base58.decode(params[:id])
linkid = hashids.decode(params[:id])
file =
if Rails.env.production?
puts "#{Base58.encode(ImageLink.find(linkid).image.id)}.png"
File.open(Rails.root.join('uploads', "#{Base58.encode(ImageLink.find(linkid).image.id)}.png"), 'rb') { |f| f.read }
else
puts "#{hashids.encode(ImageLink.find(linkid).image.id)}.png"
File.open(Rails.root.join('uploads', "#{hashids.encode(ImageLink.find(linkid).image.id)}.png"), 'rb') { |f| f.read }
end
send_data(file, type: ImageLink.find(linkid).image.mimetype, disposition: 'inline')
end
def upload
imgparam = params[:image]
if imgparam.is_a?(String)
name = File.basename(imgparam)
imgpath = save_to_tempfile(imgparam).path
else
name = imgparam.original_filename
imgpath = imgparam.tempfile.path
end
File.chmod(0666, imgpath)
%x(/usr/bin/exiftool -all= -overwrite_original #{imgpath})
logger.debug %x(which exiftool)
render json: ImageManager.save_image(imgpath, name)
end
private
def save_to_tempfile(url)
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
http.start do
resp = http.get(uri.path)
file = Tempfile.new('urlupload', Dir.tmpdir, :encoding => 'ascii-8bit')
file.write(resp.body)
file.flush
return file
end
end
end
然後在我的image.html.erb鑑於我有這樣的:
<%
@imglist.each_with_index { |link, i|
id = hashids.encode(link.id)
ext = link.image.mimetype.split('/')[1]
if ext == 'jpeg'
ext = 'jpg'
end
puts id + '.' + ext
%>
現在,如果我添加
hashids = Hashids.new("mysalt")
在ImageManager.rb main_controller.rb
,並在我的image.html .erb我得到這個錯誤:
ActionView::Template::Error (undefined method `id' for #<Array:0x000000062f69c0>)
因此,所有在執行hashids.encode/decode不是容易實現Base58.encode /解碼,我很困惑如何讓它工作...任何幫助將不勝感激。
即使我在每個文件中初始化hashids方法,它仍然會導致我無法弄清楚的問題。當使用Base58類時,我可以在控制器中進行編碼和解碼,而不會出現問題。當使用hashids.decode它似乎沒有工作相同,這給了我「未定義的方法」id'錯誤「。 它看起來像它不解碼...我如何正確解碼控制器中的ID? 我打算回去做關於railstutorials.org的教程,並且一旦解決了這個id問題,就能更好地理解rails上的ruby。 – mroth7684
@ mroth7684:您在'image.html.erb'中丟失了一個大括號。這是打算嗎? – fylooi
是的,它進一步在頁面上。我終於搞定了。問題是hashids返回一個數組而不是整數。我只需要調整代碼以在解碼之後使用陣列。 – mroth7684