如何在模型中设置属性?

时间:2014-08-08 23:04:17

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

我想从模型中自动生成哈希值。

用户创建简历后,他们可以选择通过单击共享按钮来共享它,该按钮会自动生成与特定简历视图关联的唯一(随机哈希字符串)URL。

class ResumesController < ApplicationController

  def share
    @resume = Resume.find(params[:id])

    @share = Share.new
    @share.resume_id = @resume.id 

    @share.save

    redirect_to action: 'index'
  end

end

My Share模型有两列,resume_id, which I already set in the controller, and hash_url`,我想在模型中自动设置。

class Share < ActiveRecord::Base
  attr_accessible :label, :resume_id, :url

end

我的问题是,如何创建唯一的哈希值并将其存储在hash_url列中?此外,我假设它保存之前,它必须检查共享表,以确保它不保存已存在的哈希。

2 个答案:

答案 0 :(得分:0)

您可以在保存对象之前生成并存储哈希。在您的模型中添加以下内容:

# share.rb
before_validation :generate_hash

private
def generate_hash
  self.hash_url = Resume.find(resume_id).content.hash
end

hash方法是Ruby提供的方法:http://ruby-doc.org/core-2.1.1/String.html#method-i-hash它根据字符串的长度和内容返回哈希值。

答案 1 :(得分:0)

before_create

我猜你想要将用户发送给以下人员:

domain.com/resumes/your_secret_hash_url #-> kind of like a uuid?

我这样做的方法是使用SecureRandom进行before_create回调。虽然这不会给您一个独特的价值,但您可以根据表格进行检查:

#app/models/resume.rb
Class Resume < ActiveRecord::Base
   before_create :set_hash

   private

   def set_hash
       self.hash_url = loop do
         random_token = SecureRandom.urlsafe_base64(nil, false)
         break random_token unless Resume.exists?(token: random_token)
       end
   end
end

参考:Best way to create unique token in Rails?

这样您就可以在hash_url上设置create,并使其具有唯一性