Rails 3.2 + Paperclip:在用户创建时分配默认图像

时间:2014-04-04 04:30:01

标签: ruby-on-rails model paperclip undefined

我正在努力在我的Rails应用中向用户模型添加个人资料图片。我已经获得了成功使用其他模型的截图,但出于某种原因,我在配置文件图片方面遇到了很多困难。为了处理个人资料图片,我创建了一个新的ProfilePics模型:

class ProfilePic < ActiveRecord::Base
  attr_accessible :image, :user_id

  has_attached_file :profile_pic, :default_url => "/system/user_profile_pics/profile.png",
                                  :url => "/system/user_profile_pics/:id/:basename.:extension",
                                  :path => ':rails_root/public:url'
                                  :styles => { :large => "800x400", :thumb => "36x36" }

  # **** Associations ****

  # State that each profile picture can have an associated user
  belongs_to :users

  # **** Validations ****

  # Only allow the user to upload .bmp, .gif, .jpg, .jpeg, and .png files
  validates_attachment_content_type :image, :content_type => /^image\/(bmp|gif|jpg|jpeg|png)/

  # Validate the presence of the user id
  validates :user_id, :presence => true

  # Order all profile pictures by ID, from first to last
  default_scope :order => 'profile_pics.id ASC'
end

当用户注册时,他/她应该设置默认的个人资料图片。此图片是has_attached_file方法的:default_url参数中指定的图像文件。但是,在创建用户之后,我似乎无法弄清楚如何在控制器中为用户分配默认的配置文件图片。我不想将配置文件图片添加到注册表单,如果我只是从控制器中省略它,我收到以下错误消息:

undefined method `before_image_post_process'

我没有将个人资料图片作为用户创建的要求。我相信我已经设置了所有正确的数据库表,但由于某种原因我不断收到此错误。这是我尝试在控制器中为用户分配默认的个人资料图片:

if @user.save
  # Create a profile picture for the user
  @user.profile_pic = ProfilePic.new(:image => nil, :user_id => @user.id)

  ...
end

调试时,保存用户后立即在控制台中输入“@ user.profile_pic”会返回相同的'before_image_post_process'错误。

有没有人对此问题有任何见解?非常感谢你提前!

1 个答案:

答案 0 :(得分:1)

您收到此错误是因为您将附件文件属性定义为profile_pic,但您正在对image属性进行回形针验证。

当您定义has_attached_file属性时,Paperclip会自动创建一个<name>_post_process回调,稍后会在验证中使用(其中has_attached_file属性的名称)。

您创建了profile_pic_post_process,但验证正在寻找image_post_process,因此错误。

更改ProfilePic模型中的验证行:

  # Only allow the user to upload .bmp, .gif, .jpg, .jpeg, and .png files
  validates_attachment_content_type :profile_pic, :content_type => /^image\/(bmp|gif|jpg|jpeg|png)/