获取表单值以用作回形针文件名

时间:2012-10-23 19:59:40

标签: ruby-on-rails paperclip

是否可以获取表单字段值并将其用作回形针附件文件名?

PiecePhoto型号:

belongs_to :piece

has_attached_file :image,
    :styles => {
        :slider => "940x420#",
        :single => "540>",
        :thumb => "60x60#",
        :medium => "140x140#",
        :original => "1024x1024>"
    }, 
    :path => ":attachment/:id/:style/:filename",
    :url => ":attachment/:id/:style/:filename",
    :storage => :s3,
    :bucket => 'monavala',
    :s3_credentials =>"#{Rails.root}/config/s3.yml"

validates_presence_of :image
before_post_process :parameterize_file_name

def parameterize_file_name
    extension = File.extname(image_file_name).gsub(/^\.+/, '')
    filename = File.basename(image_file_name, ".#{extension}").parameterize
    self.image.instance_write(:file_name, "#{filename}.#{extension}")
end

filename = File.basename(image_file_name, ".#{extension}").parameterize中,我希望代替image_file_name从表单字段中获取值。

修改

模型是嵌套的

Piece
    has_many :piece_photos
    accepts_nested_attributes_for :piece_photos

PiecePhotos
    belongs_to :piece
    has_attached_file :image

我明白在模型中获取表单值会破坏MVC模式。还有另一种方式吗?

EDIT2:

这里试图严格,但我想我必须多解释一下。

表单是嵌套的,我Collection形成:has_many Pieces :has_many PiecePhotos

可以为Pieces添加字段,对于每个Piece,您可以添加PiecePhotos

我希望PiecePhotos的文件名与Piece名称+一些唯一字符串或ID相同。

所以一切都必须在一个帖子里完成。我不想先上传片段照片,然后再将它们添加到片段中。

基本上我只需要获取Piece名称并将其用作PiecePhoto文件名。

这是图像现在的形式,它仍在开发中。

Form Fields

2 个答案:

答案 0 :(得分:2)

我知道这是一个古老的问题,但本周我遇到了同样的问题并最终将其付诸实施,所以我想我会回答以防其他人遇到同样的问题。

基本上,Paperclip能够通过插值(paperclip/interpolations)使用动态路径。要做到这一点,在模型的顶部,您只需添加插值代码

PiecePhoto模型:

Paperclip.interpolates :fixed_file_name do |attachment, style|
 attachment.instance.fixed_file_name
end

现在,您可以将:fixed_file_name或其他任何内容添加到网址的末尾。请务必添加:extension,否则文件将在没有文件的情况下保存。它会自动只对正在上传的文件使用相同的扩展名,因此没有任何问题。

:path => ":attachment/:id/:style/:fixed_file_name.:extension",
:url => ":attachment/:id/:style/:fixed_file_name.extension",

然后你要做的就是定义它。你甚至可以使用rails .parameterize。只需放置#{image_file_name}或字段名称,然后添加.parameterize

def fixed_file_name
 return "#{image_file_name.parameterize}"
end

我承认我只使用Rails 4.2对此进行了测试,因为这是我正在使用的,但是我能够在经过多次挫折之后才能使它工作。

答案 1 :(得分:0)

您可以在模型中使用params[:paramHere],但这不是最佳做法,因此当您使用它时,请首先创建一个副本,这样您就不会更改任何内容。

params_copy = params.dup

....
filename = params[:attachment_name]

修改

更好的选择是将文件名代码移到PiecePhotoController 有类似的东西:

def create
  @piece_photo = PiecePhotos.new
  @piece_photo.file_attachment_name = params[:file_attachment_name]

  unless @piece_photo.save do
    #error-handling
  end
end

或者,如果您要更改现有记录上的file_attachment_name,则可以将代码放入其他方法中,这样您就可以使用名为change_attachment_filename的方法。


编辑2:

但是,即使是之前的替代品也不应该被要求,因为回形针很简单,这应该足够了:

这是您的表单(显然可能还有更多字段):

<% form_for :piece_photo, :html => { :multipart => true } do |f| %>
  <%= f.file_field :photo %>
<% end %>

现在,您只需通过@piece_photo创建@piece_photo = PiecePhotos.create(params[:piece_photo])记录,然后就可以这样显示:

<%= image_tag @piece_photo.photo.url %>

<%= image_tag @piece_photo.photo.url(:thumb) %>

请查看此blog post或官方paperclip github readme