0

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

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 模式。还有其他方法吗?

编辑2:

试图在这里严格,但我想我得再解释一下。

表单是嵌套的,我有Collection那个.:has_many Pieces:has_many PiecePhotos

Pieces可以为每个Piece您可以添加的字段添加字段PiecePhotos

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

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

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

这是表格现在的样子,它仍在开发中。

表单域

4

2 回答 2

2

我知道这是一个老问题,但我这周遇到了同样的问题,终于让它工作了,所以我想我会回答,以防其他人遇到同样的问题。

基本上,回形针能够通过插值(回形针/插值)使用动态路径。为此,您只需在模型顶部添加插值代码

件照片型号:

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

现在你可以在:fixed_file_name你的 url 末尾添加或任何你想调用的内容。一定要添加,: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 对此进行了测试,因为那是我正在使用的,但在经历了很多挫折之后我能够让它工作。

于 2015-08-14T19:59:08.267 回答
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) %>

查看这篇文或官方回形针 github 自述文件

于 2012-10-23T20:12:53.523 回答