是否可以获取表单字段值并将其用作回形针附件文件名?
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文件名。
这是图像现在的形式,它仍在开发中。
答案 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。